在无法使用的环境中使用 TikZ 矩阵节点

在无法使用的环境中使用 TikZ 矩阵节点

我正在尝试制作一张练习表,其中也应该包含 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}

上述代码的输出

相关内容