etoolbox 的 iftoggle 与 verbatim

etoolbox 的 iftoggle 与 verbatim

我的问题是,我可以使用 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在其他条件语句中使用嵌套。

相关内容