我想使用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
,因此没有虚线。