根据变量调用不同的环境

根据变量调用不同的环境

我想根据情况使用不同的环境。

我尝试了以下方法,但没有效果。你能帮我找出问题所在吗?

\documentclass{article}

\usepackage{ifthen}

\newenvironment{testA}{\bfseries}{}
\newenvironment{testB}{\itshape}{}

\def\someVariable{1}

\def\variableName
{\ifthenelse{\equal{\someVariable}{1}}
        {testA}
        {testB}}

\begin{document}

\begin{\variableName}
Some text.
\end{\variableName}

\end{document}

编辑

我的目标是定义一个tcolorbox其背景颜色取决于另一个变量的环境。

答案1

\variableName需要可扩展。

\documentclass{article}

\newenvironment{testA}{\bfseries}{}
\newenvironment{testB}{\itshape}{}


\def\variableName{\ifnum\someVariable=1 testA\else testB\fi}

\begin{document}

\def\someVariable{1}
\begin{\variableName}
Some text.
\end{\variableName}

\def\someVariable{2}
\begin{\variableName}
Some text.
\end{\variableName}

\end{document}

在此处输入图片描述

如果您想比较字符串而不是数字,则可以通过比较执行以下操作\ifx

\documentclass{article}

\newenvironment{testA}{\bfseries}{}
\newenvironment{testB}{\itshape}{}

\def\testAname{testA}

\def\variableName{\ifx\someVariable\testAname testA\else testB\fi}

\begin{document}

\def\someVariable{testA}
\begin{\variableName}
Some text.
\end{\variableName}

\def\someVariable{testB}
\begin{\variableName}
Some text.
\end{\variableName}

\end{document}

答案2

可能有更好的解决方案,但这里有一个选项,它几乎遵循了您最初尝试的逻辑。

(简单解释:campa 说,您不应该在 的参数内进行条件解析\begin{...}...\end{...}。解决此问题的一种方法是使用\expandafters,但这在您的主 latex 代码中很笨重。更好的方法是将条件比较卸载到包装器环境的设置代码中。)

\documentclass{article}

\usepackage{ifthen}

\newenvironment{testA}{\bfseries}{}
\newenvironment{testB}{\itshape}{}

\def\someVariable{1}

\newenvironment{testQ}{\ifthenelse{\equal{\someVariable}{1}}{\def\variableName{testA}}{\def\variableName{testB}}%
    \expandafter\begin\expandafter{\variableName}}
    {\expandafter\end\expandafter{\variableName}}

\begin{document}

\begin{testQ}
Some text.
\end{testQ}

\def\someVariable{2}

\begin{testQ}
        More text
\end{testQ}

\end{document}

如果你if-then-else使用environ包来编程testQ环境。即:

\usepackage{environ}

...


\NewEnviron{testQ}{\ifthenelse{\equal{\someVariable}{1}}
    {\begin{testA}\BODY\end{testA}}
    {\begin{testB}\BODY\end{testB}}}

我认为这更具可读性并且也更容易编写。

答案3

:-) 这是我的看法:

\documentclass{article}

\usepackage{ifthen}

\newenvironment{dependingOnSomeVariablesValue}
{\ifthenelse{\equal{\someVariable}{1}}{\testA}{\testB}}
{\ifthenelse{\equal{\someVariable}{1}}{\endtestA}{\endtestB}}

\newenvironment{testA}{\bfseries}{FinishTestA}
\newenvironment{testB}{\itshape}{FinishTestB}

\begin{document}

\def\someVariable{1}

\begin{dependingOnSomeVariablesValue}
Some text.
\end{dependingOnSomeVariablesValue}

\def\someVariable{XYZ}

\begin{dependingOnSomeVariablesValue}
Some text.
\end{dependingOnSomeVariablesValue}

\end{document}

在此处输入图片描述

缺点/陷阱:

\someVariable不要在环境内部全局改变定义/“值” dependingOnSomeVariablesValue。:-)

关于不正确嵌套环境的错误消息\@currenvir将表示短语“dependingOnSomeVariablesValue”而不是“testA”或“testB”。



另一种可能性是使用\pdfstrcmp

\documentclass{article}

\newenvironment{testA}{\bfseries}{}
\newenvironment{testB}{\itshape}{}

\newcommand\variableName{\ifnum\pdfstrcmp{\someVariable}{1}=0 testA\else testB\fi}
%\newcommand\variableName{test\ifnum\pdfstrcmp{\someVariable}{1}=0 A\else B\fi}

\begin{document}

\def\someVariable{1}

\begin{\variableName}
Some text.
\end{\variableName}

\def\someVariable{XYZ}

\begin{\variableName}
Some text.
\end{\variableName}

\end{document}

在此处输入图片描述

缺点/陷阱:

不要在“环境”\someVariable内全局改变定义/“值” 。:-)\variableName

相关内容