在大型文档中,我想根据全局变量“flagenv”的值使用“env1”或“env2”环境。我该如何定义环境“foo”,以便可以编写类似以下内容:
flagenv = 1 % 1 for env1 and 2 for env2
...
\begin{document}
\begin{foo} % will be read as \begin{env1}
...
\end{foo}
\end{document}
谢谢。
答案1
就像是:
\documentclass{...
\usepackage{...
...
%\newcommand\flagenv{0 }%
\newcommand\flagenv{1 }%
%\newcommand\flagenv{2 }%
%\newcommand\flagenv{3 }%
...
\ifcase\flagenv
⟨ definition of environment foo in case \flagenv=0 ⟩
\or
⟨ definition of environment foo in case \flagenv=1 ⟩
\or
⟨ definition of environment foo in case \flagenv=2 ⟩
\or
⟨ definition of environment foo in case \flagenv=3 ⟩
\else
⟨ definition of environment foo in case \flagenv<0 or \flagenv>3 ⟩
\fi
...
\begin{document}
...
\begin{foo}
...
\end{foo}
...
\end{document}
答案2
当您\begin{env1}...\end{env1}
大致写下发生的事情时,LaTeX 会启动一个“组”,然后插入命令\env1...\endenv1
。因此,要做到这一点,只需制作命令\foo
并\endfoo
执行\env1
等即可\endenv1
,这很容易使用\letcs
来自的命令来完成电子工具箱包。更详细地说,
\documentclass{article}
\usepackage{etoolbox}
\usepackage{verbatim}
\newenvironment{env1}{Environment 1\csuse{verbatim*}}{\csuse{endverbatim*}}
\newenvironment{env2}{Environment 2\verbatim}{\endverbatim}
\newcommand\SetFoo[1]{\letcs{\foo}{env#1}\letcs{\endfoo}{endenv#1}}
\begin{document}
\SetFoo{1}
\begin{foo}
My little environment
\end{foo}
\SetFoo{2}
\begin{foo}
My little environment
\end{foo}
\end{document}
产生输出
与 MWE 一样,您可以使用该命令在文档中多次\SetFoo
更改环境的含义,包括在序言中仅更改一次。实际上,宏定义了环境,因此需要在第一个环境之前“调用”它。foo
\SetFoo{?}
foo
foo
在上面的代码中,我展示了两种不同的verbatim
环境用法示例。这可能适合您的用例,但如果不了解您要做什么,则无法保证这一点 - 这就是为什么最好在最小工作示例作为任何问题的一部分。
边注一般来说,LaTeX 命令中不应该包含数字,但是,如图所示,这对于环境来说是可以的,尽管这种用法可能会冒犯纯粹主义者。