使用 xargs 定义自定义环境

使用 xargs 定义自定义环境

我想使用xargs包为以下 LaTeX 框定义一个自定义环境,但目前我遇到了错误,并且对如何正确地创建环境有点困惑。

首先,这是所讨论的盒子,然后是用途,最后是环境:

    \newtcblisting[auto counter, number within=section, list inside=examplelist]{tcbexample}[2][]{%
    colback=gray!5, colbacktitle=gray!40, coltitle=black,
    frame hidden, arc=2pt, titlerule=0pt, toptitle=2pt, bottomtitle=2pt,
    fonttitle=\bfseries, breakable, enhanced, parbox=false,
    comment and listing,
    title=Example~\thetcbcounter,
    comment={#2},#1
    }

以下是使用中的框的示例和源代码:

\begin{tcbexample}[name = Finding All Occurences, listing options = {language = Python}]
{Use re.findall() to return all instances of a string (text) }
locations = "CA 91105, NY 13078, CA 94702"
re.findall(r'\d\d\d\d\d', locations)
# ['91105', '13078', '94702'] (code)
\end{tcbexample}

在此处输入图片描述

这基本上遵循了 的模式\begin{tcbexample}[optional arguments, which set name, list type, listing options]{text/comments}code\end{tcbexample}。我决定通过使用 xargs 添加新环境来节省一些输入,但它不断出现错误。这是我所拥有的:

\newenvironmentx{example}[2][1={},2={}]{%
    \begin{tcbexample}{#1}{#2}
        }{%
    \end{tcbexample}
}

有人知道如何正确地创建新的自定义环境吗xargs?如果是这样,你能帮我找出问题所在以及如何纠正它吗?谢谢!

答案1

首先让我们看看提议的设置会导致什么:

\documentclass{article}
\usepackage{xargs}

\newenvironmentx{test}[2][1={abc},2={xyz}]
{Begin \#1=#1, \#2=#2}{End}

\begin{document}

\begin{test}
Text
\end{test}

\begin{test}[ABC]
Text
\end{test}

\begin{test}[ABC][XYZ]
Text
\end{test}

\begin{test}[][XYZ]
Text
\end{test}

\end{document}

在此处输入图片描述

因此,我猜测您希望您的环境采用类似的语法example

\begin{example}[<tcolorbox options>][<comment>]

我不确定这是否有帮助,因为它会迫使你[]每次想要评论时添加:

\begin{example}[][some comment]

因为

\begin{example}[some comment]

将把括号中的材料传递为<tcolorbox options>

现在您可以判断是否要采用这一策略。

接下来,我将向您展示如何消除\newcommandx不受支持的部分tcolorbox并用于expl3工作。

\documentclass{article}

\NewDocumentEnvironment{test}{ O{abc} O{xyz} }
  {Begin \#1=#1, \#2=#2}
  {End}

\begin{document}

\begin{test}
Text
\end{test}

\begin{test}[ABC]
Text
\end{test}

\begin{test}[ABC][XYZ]
Text
\end{test}

\begin{test}[][XYZ]
Text
\end{test}

\end{document}

您将获得与之前相同的输出。请注意,这更简单,但与以下xargs方法非常相似:O{abc}表示具有默认值的可选参数abc

如果您的 LaTeX 编译器无法运行\NewDocumentEnvironment,请添加\usepackage{xparse}

好消息是,这种方法得到了支持tcolorbox。并且它允许更精细的控制。

\documentclass{article}
\usepackage[many]{tcolorbox}
\tcbuselibrary{xparse,listings}

\NewTCBListing[
  auto counter,
  number within=section,
  list inside=examplelist,
]{example}{ O{} !o }{
  colback=gray!5,
  colbacktitle=gray!40,
  coltitle=black,
  frame hidden,
  arc=2pt,
  titlerule=0pt,
  toptitle=2pt,
  bottomtitle=2pt,
  fonttitle=\bfseries,
  breakable,
  enhanced,
  parbox=false,
  title=Example~\thetcbcounter,
  IfValueTF={#2}{comment and listing,comment={#2}}{listing only},
  #1,
}

\begin{document}

\begin{example}[%
  listing options = {language = Python}
][Use re.findall() to return all instances of a string (text)]
locations = "CA 91105, NY 13078, CA 94702"
re.findall(r'\d\d\d\d\d', locations)
# ['91105', '13078', '94702'] (code)
\end{example}

\begin{example}[listing options = {language = Python}]
locations = "CA 91105, NY 13078, CA 94702"
re.findall(r'\d\d\d\d\d', locations)
# ['91105', '13078', '94702'] (code)
\end{example}

\end{document}

在此处输入图片描述

您可以看到“无评论”也是如此listings only,因此没有虚线。

相关内容