布尔条件中的环境内的逐字文本

布尔条件中的环境内的逐字文本

我的代码如下所示

\documentclass{article}
\usepackage{environ}

\newcommand{\showsolution}{1}
\NewEnviron{mysolution}{
\if\showsolution1
    \fbox{\BODY}
\fi}

\begin{document}

\begin{mysolution}
    \begin{verbatim}
       code code code
    \end{verbatim}
 \end{mysolution}

 \end{document}

其中solution环境是使用包创建的NewEnviron,因为我想根据 if 语句显示解决方案。但是,如果我现在想使用 verbatim 将代码放入解决方案中,我会得到失控参数 / 段落在 \next 完成之前结束。编辑:使用上面的 MWE,错误更改为缺少 \item。但是,注释掉错误中的 verbatim 会消失,因此即使错误发生了变化,它仍然是同一个问题。

我猜解决方案类似于beamer的框架环境中的脆弱选项,但我不知道该包是否有类似的选项environ。那么我如何将逐字文本(或至少代码)放入 if 语句中?

答案1

感谢大家的回复。Steven 的建议非常好,但缺点是如果想在代码片段之间写入文本,则需要多个框(必须在实际解决方案环境之外定义)。

另一种方法是使用包lstinline中的命令listings。它在解决方案环境中工作,至少可以编写内联代码。但是这个包提供了另一个命令,lstinputlisting允许显示来自外部文件的代码。然后可以使用选项指定要显示的代码部分。这种方法的缺点当然是 1) 需要一个额外的文件,2) 添加firstlinelastline删除代码需要调整第一行/最后一行选项

\documentclass{article}
\usepackage{environ}
\usepackage{listings}
\usepackage{filecontents}
\begin{filecontents*}{ThisMWEasFile}
 1 blah &$ blah !
 2 Blah!@
 3 blah &$ blah @
 4 Blah!@
 5 blah &$ blah #
 6 Blah!@
 7 blah &$ blah $
 8 Blah!@
 9 blah &$ blah %
10 Blah!@
11 blah &$ blah ^
12 Blah!@
13 blah &$ blah &
14 Blah!@
15 blah &$ blah *
16 Blah!@
\end{filecontents*}

\newif\ifshowsolution
\showsolutiontrue

\NewEnviron{mysolution}{
\ifshowsolution
    \BODY
\fi}

\begin{document}
\begin{itemize}

    \item[Question 1:] Question with solution.\\
        \begin{mysolution}
            \lstinputlisting[firstline=1, lastline=5]{ThisMWEasFile.tex}
        \end{mysolution}
    \item[Question 2:] Question with solution.\\
        \begin{mysolution}
            \lstinputlisting[firstline=6, lastline=10]{ThisMWEasFile.tex}
            \textbf{text text text}
            \lstinputlisting[firstline=11, lastline=15]{ThisMWEasFile.tex}
        \end{mysolution}
\end{itemize}
\end{document}

在此处输入图片描述

答案2

使用该scontents软件包,您可以轻松实现所需的功能。所有内容(包括内容)都存储在内存中verbatim。如果您愿意,还可以使用键将内容保存到外部文件中write-env=file.tex。我稍微修改了您的示例文件,输出相同 :)

\documentclass{article}
\usepackage[store-env=solutions]{scontents}
%\newif\ifshowsolution
%\showsolutiontrue
%\ifshowsolution
\setupsc{print-env=true}
%\fi
\pagestyle{empty}
\begin{document}
\begin{itemize}

\item[Question 1:] Question with solution.\\
\begin{scontents}
\begin{verbatim}
 1 blah &$ blah !
 2 Blah!@
 3 blah &$ blah @
 4 Blah!@
 5 blah &$ blah #
\end{verbatim}
\end{scontents}
\item[Question 2:] Question with solution.\\
\begin{scontents}
\begin{verbatim}
6 Blah!@
7 blah &$ blah $
8 Blah!@
9 blah &$ blah %
10 Blah!@
\end{verbatim}
\textbf{text text text}
\begin{verbatim}
11 blah &$ blah ^
12 Blah!@
13 blah &$ blah &
14 Blah!@
15 blah &$ blah *
16 Blah!@
\end{verbatim}
\end{scontents}
\end{itemize}
\end{document}

输出

答案3

另一个选项是使用exam文档类。使用solution环境编写解决方案,使用answers选项确定是否要打印解决方案。

答案4

正如其他人指出的那样,verbatim内容不能作为宏的参数进行处理。但是,在这里,该verbatimbox包允许将逐字内容(未打印)放入 LaTeX 框中,稍后可以通过宏调用。然后,您可以使用 if 条件来确定是否执行包含逐字内容的宏。

\documentclass{article}
\usepackage{verbatimbox}
\newif\ifsoln
\begin{document}
\begin{myverbbox}{\solutionA}
\code #$code code
\end{myverbbox}
Here, 
\solntrue
\ifsoln
\fbox{\solutionA}
\fi
is printed, whereas here,
\solnfalse
\ifsoln
\fbox{\solutionA}
\fi
it is not printed, based on an if condition.
\end{document}

在此处输入图片描述

尝试采用原始提问的形式,这可能会有用:

\documentclass{article}
\usepackage{environ,verbatimbox}

\newif\ifshowsolution
\NewEnviron{mysolution}{
\ifshowsolution
    \fbox{\BODY}
\fi}

\begin{document}
\showsolutiontrue
\begin{verbbox}
code code code
\end{verbbox}

Here it shows:
\begin{mysolution}
    \theverbbox
\end{mysolution}

\showsolutionfalse
Here it does not:
\begin{mysolution}
    \theverbbox
\end{mysolution}

 \end{document}

在此处输入图片描述

相关内容