如何使列表连通?

如何使列表连通?

在下面的例子中,\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}

这确实有效,但也是打开潘多拉魔盒的最有效方法之一。添加此示例只是为了说明局部性是问题所在,但您绝对不应该将其用于任何旨在排版稳定文档的代码。

相关内容