在下面的例子中,\Baz
清单 2 应该依赖于\Foo
清单 1,但这样做会导致错误。有没有办法将两者联系起来?换句话说,是否可以将(长)清单分解为子清单?
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{listings, breakable}
\newtcblisting[auto counter]
{listing}[2][]{
noparskip,
breakable,
title=Listing~\thetcbcounter. #1,
listing and text,
%text only,
#2
}
\usepackage{xparse}
\begin{document}
\begin{listing}[]
{label=listing:foo}
\NewDocumentCommand\Foo{}{Foo}
\end{listing}
\begin{listing}[]
{label=listing:baz}
\NewDocumentCommand\Baz{}{\Foo}
\Baz
% ERROR: Undefined control sequence.
%
%--- TeX said ---
%\Baz code ->\Foo
%
%l.2 \Baz
% % \Baz code ->\Foo
%
\end{listing}
\end{document}
答案1
我会这样做:
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{listings, breakable}
\newtcblisting[auto counter]
{listing}[2][]{
noparskip,
breakable,
title=Listing~\thetcbcounter. #1,
listing and text,
%text only,
#2
}
\usepackage{xparse}
\begin{document}
\begin{listing}[]
{label=listing:foo}
\NewDocumentCommand\Foo{}{Foo}
\end{listing}
\NewDocumentCommand\Foo{}{Foo}
\begin{listing}[]
{label=listing:baz}
\NewDocumentCommand\Baz{}{\Foo}
\Baz
\end{listing}
\end{document}
正如世界上最著名的猫所说他的回答,\Foo
是本地定义的,因此当环境结束时,该定义将不复存在。如果要在环境之外使用它,则需要在外部作用域中定义该命令。
我没有使用\def
-like 命令(这将产生与您想要的不同的列表),而是在环境结束后重复定义。这可确保您的列表保持不变。
答案2
问题在于你定义\Foo
本地。如果你使它成为全局的,它就可以工作。
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{listings, breakable}
\newtcblisting[auto counter]
{listing}[2][]{
noparskip,
breakable,
title=Listing~\thetcbcounter. #1,
listing and text,
%text only,
#2
}
\usepackage{xparse}
\begin{document}
\begin{listing}[]
{label=listing:foo}
\xdef\Foo{Foo}
\end{listing}
\begin{listing}[]
{label=listing:baz}
\edef\Baz{\Foo}
\Baz
\end{listing}
\end{document}
你可以,但绝对应该不是,使之\NewDocumentCommand
全球化。
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{listings, breakable}
\newtcblisting[auto counter]
{listing}[2][]{
noparskip,
breakable,
title=Listing~\thetcbcounter. #1,
listing and text,
%text only,
#2
}
\usepackage{xparse}
\begin{document}
\begin{listing}[]
{label=listing:foo}
\globaldefs1
\NewDocumentCommand\Foo{}{Foo}
\globaldefs0
\end{listing}
\begin{listing}[]
{label=listing:baz}
\NewDocumentCommand\Baz{}{\Foo}
\Baz
\end{listing}
\end{document}
这确实有效,但也是打开潘多拉魔盒的最有效方法之一。添加此示例只是为了说明局部性是问题所在,但您绝对不应该将其用于任何旨在排版稳定文档的代码。