我想根据情况使用不同的环境。
我尝试了以下方法,但没有效果。你能帮我找出问题所在吗?
\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