我采用tcolorbox自定义了一个盒子,想要得到一个有可选参数时没有编号,没有可选参数时有编号且编号只有在没有可选参数输入时才增加,但是目前得到的结果会自己增加,请问大佬们该怎么修改呢?MWE
如下:
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{skins,minted}
%% 重定义minted环境前的行号样式
\renewcommand{\theFancyVerbLine}
{%
\ttfamily\textcolor[rgb]{0.5,0.5,1.0}
{%
\footnotesize\arabic{FancyVerbLine}
}
}
\newcounter{myexample}
\NewTCBListing[use counter=myexample]{myjava}{!O{code:\thetcbcounter}}{%
listing engine = minted,
minted style = colorful,
minted language = java,
%minted label =#1
minted options={%
fontsize = \small,
breaklines,
autogobble,
linenos,
numbersep = -1.5mm,
%numbersep = 3pt,
keywordcase = lower, % 关键字小写, upper为大写, capitalize为首字母大写, 默认为lower
mathescape = true, % 在注释中可以书写并渲染数学公式
showspaces = false,
tabsize = 4,
texcomments = false,
%framerule = 1pt,
%breaklines = true,
fontfamily = tt,
},
%colback = blue!5!white,
%colframe = blue!75!black,
colback = white,
colframe = black,
colbacktitle=white,
coltitle=black,
listing only,
left = 5mm,
enhanced,
overlay = {\begin{tcbclipinterior}\fill[red!20!blue!20!white] (frame.south west)
rectangle ([xshift = 5mm]frame.north west);\end{tcbclipinterior}},
attach boxed title to top center = {yshift =-3mm},
center title,
title = #1,
fonttitle = \ttfamily\large,
boxrule=0.75pt,
boxed title style={
boxrule=0pt,
colframe=white,
size = fbox,
},
%frame hidden
%boxed title style={arc=0pt,outer arc=0pt,boxrule=0pt},
}
\begin{document}
\begin{myjava}[test]
public class HelloWorld {
// A `Hello World' in Java
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
\end{myjava}
\begin{myjava}
public class HelloWorld {
// A `Hello World' in Java
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
\end{myjava}
\end{document}
相当于想让这里的code:2
显示为code:1
,后续依次类推
如果没有递增计数器,\ref
显示为空,hyperref
不会为空的文本创建超链接。
只能使用 \hyperref[<label>]{<text>}
或 \pageref
。
也可以在写入 \label
时就指定需要显示的文字:
\documentclass{article}
\usepackage{tcolorbox}
\usepackage{hyperref}
\tcbuselibrary{skins,minted}
%% 重定义minted环境前的行号样式
\renewcommand{\theFancyVerbLine}
{%
\ttfamily\textcolor[rgb]{0.5,0.5,1.0}
{%
\footnotesize\arabic{FancyVerbLine}
}
}
\makeatletter
\protected\def\setnextlabeltext#1{\AddToHookNext{label}{\protected@edef\@currentlabel{#1}%
\edef\@currentlabel{\detokenize\expandafter{\@currentlabel}}}}
\makeatother
\newcounter{myexample}
\NewTCBListing{myjava}{O{} O{}}{%
listing engine = minted,
minted style = colorful,
minted language = java,
%minted label =#1
minted options={%
fontsize = \small,
breaklines,
autogobble,
linenos,
numbersep = -1.5mm,
%numbersep = 3pt,
keywordcase = lower, % 关键字小写, upper为大写, capitalize为首字母大写, 默认为lower
mathescape = true, % 在注释中可以书写并渲染数学公式
showspaces = false,
tabsize = 4,
texcomments = false,
%framerule = 1pt,
%breaklines = true,
fontfamily = tt,
},
%colback = blue!5!white,
%colframe = blue!75!black,
colback = white,
colframe = black,
colbacktitle=white,
coltitle=black,
listing only,
left = 5mm,
enhanced,
overlay = {\begin{tcbclipinterior}\fill[red!20!blue!20!white] (frame.south west)
rectangle ([xshift = 5mm]frame.north west);\end{tcbclipinterior}},
attach boxed title to top center = {yshift =-3mm},
center title,
%IfValueTF = {#1}{title=#1}{step=myexample, title=code:\themyexample},
IfEmptyTF = {#1}{% 第一个没有值
step=myexample, title=code:\themyexample,
IfEmptyTF={#2}{label=code:\themyexample}{label={#2}}
}{% 第一个有值
title={#1}, IfEmptyTF={#2}{}{phantom=\setnextlabeltext{#1},phantomlabel={#2}}
},
fonttitle = \ttfamily\large,
boxrule=0.75pt,
boxed title style={
boxrule=0pt,
colframe=white,
size = fbox,
},
%frame hidden
%boxed title style={arc=0pt,outer arc=0pt,boxrule=0pt},
}
\begin{document}
\begin{myjava}[test][aaa]
public class HelloWorld {
// A `Hello World' in Java
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
\end{myjava}
\begin{myjava}
public class HelloWorld {
// A `Hello World' in Java
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
\end{myjava}
a\hyperref[aaa]{text}.\pageref{aaa}.\ref{aaa}.\ref{code:1}.
\end{document}
这个 \setnextlabeltext
也可以在递增计数器之后,\label
之前使用。
雾佬,想再次打扰您一下,这样设置之后,编号确实能正确引用了,但是我在实际使用过程中碰到了新的问题,当我的代码中引入了
#
号(代码语言中的注释符),就会得到报错:MWE如下:
begin{myjava}
end{myjava}
请问这该如何解决呢?
@u3379 在
@u10307 在参数最后面加上
\relax
。如果不行的话,还要在
\tcbuselibrary{skins,minted}
后面加上(应该是不需要的):@u10307 确实可以了,谢谢大佬,另外这条命令
是只能在导言区使用么,如果我把导言区的所有内容封装到一个
sty
文件中,然后使用usepackage
的方法调用貌似这条命令就失效了@u3379 确定是完全一样的吗?
tcolorbox
选项顺序(IfEmptyTF
那几个)不能改变。@u10307 看看是不是有宏包修改了
\label
的定义,在正文使用\meaning\label
看看结果是不是这个@u10307 好像确实不一样诶:
这应该是哪个宏包的定义呀
@u10307 还有我发现在beamer中貌似也不能用诶,貌似beamer中的
label
命令也跟您给出的定义不太一样:@u3379 这是在旧版 LaTeX 下使用
nameref
导致的,较新的 LaTeX 不会有这个问题,更新一下全部宏包或下载 TeXLive 2024。如果不愿意更新的话在
nameref
后面加上(更新了就不需要加了):@u10307 好的,谢谢大佬。