我正在尝试制作一张练习表,其中也应该包含 LaTeX 代码中的解决方案。使用包选项,我可以选择是否应该排版解决方案。我遇到了一个问题并提取了一个 MWE:
\documentclass{scrartcl}
\usepackage{environ}
% \NewEnviron{Loesung}{\BODY}
\newenvironment{Loesung}{}{}
\usepackage{tikz}
\usetikzlibrary{circuits.logic.IEC}
\tikzset{>=stealth,circuit logic IEC}
\begin{document}
Task: Draw a NAND and a NOR gate.
\begin{Loesung}
\begin{tikzpicture}
\matrix[column sep=7mm]%,ampersand replacement=\&]%
{
\coordinate (A); \\
& \node [nand gate] (g1) {} ; & \node [nor gate] (g2) {}; & \coordinate (out); \\
\coordinate (B); \\
};
\end{tikzpicture}
\end{Loesung}
\end{document}
如果我使用上述代码中的环境,编译一切正常。一旦我切换到替代方法\NewEnviron
,就会出现 TikZ 绘图中的大量错误。
您可以用其他宏替换“与”符号(这里我已准备好\&
)。您可以替换绘图中的“与”符号,它应该可以在environ
创建的环境中工作。
我的想法是,要么有条件地将Loesung
环境定义为空,要么隐藏环境的内容(参见例如这个帖子)。
我能想到的唯一解决方案是
- 使用
comment
包 - 重新定义列分隔宏,如 MWE 中所示
说实话,我还没有comment
广泛尝试过这种方法,但我宁愿避免重新定义宏的问题,因为这可能会很快让人措手不及。
所以有人能向我解释为什么\matrix
和\NewEnviron
不兼容或者我是否需要进行更多调整(例如使其变得脆弱等等,不知道 TeX 的技术细节)?
编辑1:
由于答案似乎与我的主要问题有些偏差,因此我稍微改变了 MWE,并将在这里提供更多信息:
事实上,我们的目的是制作两份文件。一份文件是供学生使用的考试或试卷。当然,解决方案不应该打印在这个版本上。另一份版本是我自己的解决方案,供学生修改。这应该包含任务和解决方案。
抱歉,这个词Lösung
是德语,意思是解决方案。我把Loesung
它想错了。
为了实现这两个相似的文档,我有 3 个要素:一个文件作为 MWE,但没有第一行(\documentclass
)。我有两个文件只有三到四行(\documentclass
,创建并设置布尔值和\input
中心文件)。这样,两个版本在同时编译时始终保持同步。
为了避免我的完整中心文件被各种控制宏弄得乱七八糟,我希望将隐藏(和其他一些东西)的工作集中到一个环境中。为了能够打开/关闭内容,我需要使用,\NewEnviron
否则我会遇到编译问题。
我发现整个控制逻辑没有问题,但是和 TikZ 的组合(据我所知,\NewEnviron
它会改变的 catcode )失败了。&
\matrix
那么:我该怎么做才能\matrix
在不重新映射“&”符号的情况下完成工作?
答案1
tcolorbox
最初是为了展示乳胶代码及其结果而开发的,那么为什么不使用它呢?
以下代码只是展示其工作原理的初步想法。Loesung
现在是一个tcblisting
环境,其中上部将显示tikzpicture
而下部将显示相应的 latex 代码。但您可以使用lowerbox=ignored
选项来显示或不显示 latex 代码。此选项可应用于所有代码片段,或作为每个示例的选项引入。
当然,所有框方面和列表+结果分布都可以根据您的喜好进行更改。
这是代码:
\documentclass{scrartcl}
\usepackage[most]{tcolorbox}
\tcbset{lowerbox=ignored}
\newtcblisting{Loesung}{enhanced, text and listing}
\usepackage{tikz}
\usetikzlibrary{circuits.logic.IEC}
\tikzset{>=stealth,circuit logic IEC}
\begin{document}
\begin{Loesung}
\begin{tikzpicture}
\matrix[column sep=7mm]%,ampersand replacement=\&]%
{
\coordinate (A); \\
& \node [nand gate] (g1) {} ; & \node [nand gate] (g2) {}; & \coordinate (out); \\
\coordinate (B); \\
};
\end{tikzpicture}
\end{Loesung}
\end{document}
\tcbset{lowerbox=ignored}
这是使用active 的结果
这与上一行注释
答案2
如果您想要编写两倍环境主体,则必须将该内容作为参数,就好像它是命令的参数一样(而标准 LaTeX 环境仅在主体之前和之后添加代码)。
但是,无法将 Tikz 矩阵放入命令的参数中,因为 Tikz 会更改 & 符号的 catcode &
。
不过,有一个解决方法:将环境主体写入外部文件并读取该文件两次。
\documentclass{article}
\usepackage{verbatim}
\usepackage{fancyvrb}
\ExplSyntaxOn
\makeatletter
\cs_generate_variant:Nn \iow_now:Nn { N V }
\iow_new:N \l__pantigny_stream
\NewDocumentEnvironment{MyEnv}{}
{
\group_begin:
\iow_open:Nn \l__pantigny_stream { correction.tex }
\tl_map_function:nN
{ \ \\ \{ \} \$ \& \# \^ \_ \% \~ }
\char_set_catcode_other:N
\char_set_catcode_active:N \^^M
\cs_set:Npn \verbatim@processline
{ \iow_now:NV \l__pantigny_stream \verbatim@line }
\verbatim@start
}
{
\iow_close:N \l__pantigny_stream
\group_end:
\VerbatimInput { correction.tex }
\file_input:n { correction.tex }
}
\makeatother
\ExplSyntaxOff
\usepackage{tikz}
\usetikzlibrary{circuits.logic.IEC}
\tikzset{>=stealth,circuit logic IEC}
\begin{document}
\begin{MyEnv}
\begin{tikzpicture}
\matrix[column sep=7mm]%
{
\coordinate (A); \\
& \node [nand gate] (g1) {} ;
& \node [nand gate] (g2) {};
& \coordinate (out); \\
\coordinate (B); \\
};
\end{tikzpicture}
\end{MyEnv}
\end{document}