我的问题是,我可以使用 etoolbox 的 来设置切换\newtoggle{x}
,将其设置为 true \toggletrue{x}
,甚至可以将其与 一起使用iftoggle{x}{this for true}{this for false}
。但是,如果我尝试将verbatim
环境放在条件块内,它会中断并显示错误消息:
Runaway argument?
for x in range(1, 43): print('x=', x) \end {verbatim}
./q4.tex:19: Paragraph ended before \@xverbatim was complete.
<to be read again> )
./Quiz1.tex:90: Missing number, treated as zero.
<to be read again>
{
l.90 \vspace{
1 pc}
?
\par
l.19 }{}
?
对于代码:
\iftoggle{displaysolutions}{
\textit{The statement will execute y times.}
\begin{verbatim}
for x in range(0, y):
print('x=', x)
\end{verbatim}
}{}
你知道我可能做错了什么吗?还有其他选择吗?
答案1
不允许在另一个命令的参数中使用verbatim
环境:当环境已经作为参数读入时,无法对特殊字符的含义进行需要的更改。
一种解决方法是采用“原始”语法:
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand{\iftoggleverb}[1]{%
\ifcsdef{etb@tgl@#1}
{\csname etb@tgl@#1\endcsname\iftrue\iffalse}
{\etb@noglobal\etb@err@notoggle{#1}\iffalse}%
}
\makeatother
\newtoggle{displaysolutions}
\togglefalse{displaysolutions}
\begin{document}
\section{A}
Are solutions displayed? \iftoggle{displaysolutions}{Yes}{No}.
\iftoggleverb{displaysolutions}
\noindent\textit{The statement will execute y times.}
\begin{verbatim}
for x in range(0, y):
print('x=', x)
\end{verbatim}
\fi
\toggletrue{displaysolutions}
\section{B}
Are solutions displayed? \iftoggle{displaysolutions}{Yes}{No}.
\iftoggleverb{displaysolutions}
\noindent\textit{The statement will execute y times.}
\begin{verbatim}
for x in range(0, y):
print('x=', x)
\end{verbatim}
\fi
\end{document}
\fi
无论你想显示与否,后面都应该有一个“匹配”。
您还可以使用
\iftoggleverb{displaysolutions}
<material to be displayed if the toggle is true>
\else
<material to be displayed if the toggle is false>
\fi
重要的限制。不要\iftoggleverb
在其他条件语句中使用嵌套。