在介绍具体用例之前,我先将此作为一个一般性问题发布。如果此问题已经发布,并且我使用了错误的术语来表达我想要的意思,我深表歉意,我的搜索相对没有结果。
一般情况
我想创建一个通用环境模板,该模板从环境内部传递命令。然后,这些命令定义环境在编译时如何呈现。我想这样做,以便我传递给环境的可选命令数量对于格式化目的而言是任意的。此外,我想添加大量可选命令,同时避免使用巨大的字符串{}{}{}{}
。
下面是我想要的一个不起作用的例子:
\documentclass{article}
\newenvironment{testenv}%
{%
This is \Alice\Bob
\begin{center}
I want to talk about \Bob
}%
{%
\end{center}
}%
\newcommand{\Alice}[1]{#1}
\newcommand{\Bob}[1]{#1}
\begin{document}
\begin{testenv}
\Alice{asdf}
\Bob{jkl}
this is everything
\end{testenv}
\begin{testenv}
\Bob{jkl}
this is just Bob
\end{testenv}
\end{document}
在此示例中,自定义环境始终打印“我想谈谈 \Bob”以及其他文本。但是,环境的标题verbatim
取决于我们在\Alice
和中输入的内容(如果有的话) \Bob
。
相关文章
- 我知道如何使用
ifthen
包使参数成为可选的,如下问题所述:https://stackoverflow.com/questions/1812214/latex-optional-arguments。为了简单起见,我没有在这个例子中包含该部分。 - 我知道命令可以使用可选参数,但我不知道它在环境中如何工作:“家庭”中的可选参数......何时以及如何?。
询问
- 显然这行不通。我在思考 TeX 中的命令和环境之间的关系时是否完全错了?
- 有没有办法使这个通用示例发挥作用?
- 这是 的情况吗
xparse
?我从来没有用过它,所以我该怎么做呢?
具体案例
我真正想要做的是创建一个自定义配方环境,并在边距中添加相关信息(这是一个小众案例,所以我想我会先提出一般性问题)。为此,我正在使用包marginnote
。我希望边距提供大量信息,并且我希望使用变量来轻松复制。目前,我对框中想要的不同元素有单独的命令。从我的样式模板(这不是 MWE):
\newcommand{\serves}[1]{%
\marginnote{Serves: #1~\\*}%
}
\newcommand{\vegetarian}{%
\marginnote{\textcolor{forestgreen}{\textbf{Veggie}}}~\\*%
}
\newcommand{\vegan}{%
\marginnote{\colorbox{green!20}{\textbf{Vegan}}}~\\*%
}
\newcommand{\preptime}[1]{%
\marginnote{Prep: #1}~\\*%
}
\newcommand{\cooktime}[1]{%
\marginnote{Cook time: #1}~\\*%
}
~\\*
个别食谱需要这些内容的特定组合,通常是多个。您会注意到每个命令末尾的hacky 。如果我不包括这个,这些框会相互重叠。如果我包括它,换行符也会保留在文档中。参见示例图像:
我正在将我的 hacky 解决方案转换为更清晰的模板,以避免我的“newenvironment{recipe}”中的重叠问题,但我还没有找到一种方法来在边缘以编程方式执行此操作,并使用我想要的所有可选参数。
询问
- 如果我应该使用特定工具来实现我的具体情况的目标,请随意评论它和/或将其包含在一般情况的答案中。但是,请优先回答一般问题。
答案1
您想要什么输入形式或它们应该生成什么输出确实不是很清楚,但这里有一个环境,它采用一个可选参数,该参数是以逗号分隔的键/值对列表。
\documentclass{article}
\ExplSyntaxOn
\bool_new:N\l_bool_alice
\bool_new:N\l_bool_bob
\keys_define:nn{abc}{
alice.bool_set:N =\l_bool_alice,
bob.bool_set:N = \l_bool_bob,
vegan.tl_set:N= \l_vegan_tl
}
\NewDocumentEnvironment{testenv}{O{}}
{
\keys_set:nn {abc}{#1}
\begin{center}
\bool_if:NT\l_bool_alice {I ~want ~to ~talk ~about ~Alice.}\par
\bool_if:NT\l_bool_bob {I ~want ~to ~talk ~about ~Bob.}\par
}
{
\tl_if_empty:NF\l_vegan_tl{\marginpar{\bfseries\l_vegan_tl}}
\end{center}
}
\ExplSyntaxOff
\begin{document}
\begin{testenv}[alice]
aaa
\end{testenv}
\bigskip\hrule\bigskip
\begin{testenv}[alice,bob,vegan=wibble]
bbb
\end{testenv}
\end{document}