我的代码如下所示
\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) 添加firstline
或lastline
删除代码需要调整第一行/最后一行选项
\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}