一般情况

一般情况

在介绍具体用例之前,我先将此作为一个一般性问题发布。如果此问题已经发布,并且我使用了错误的术语来表达我想要的意思,我深表歉意,我的搜索相对没有结果。

一般情况

我想创建一个通用环境模板,该模板从环境内部传递命令。然后,这些命令定义环境在编译时如何呈现。我想这样做,以便我传递给环境的可选命令数量对于格式化目的而言是任意的。此外,我想添加大量可选命令,同时避免使用巨大的字符串{}{}{}{}

下面是我想要的一个不起作用的例子:

\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

相关文章

询问

  • 显然这行不通。我在思考 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}

相关内容