逐字打印小的 TeX 代码并渲染它

逐字打印小的 TeX 代码并渲染它

为了编写一些文档,我希望能够定义如下命令

\showcase{x^{y}\in\Omega}

其展开大致相当于

\verb|x^{y}\in\Omega| & $x^{y}\in\Omega$ \\

这样我就可以展示乳胶代码的样子以及它在文档中如何显示。

现在我知道它实际上不可能用于\verb这个,因为它是真的易碎,您无法将参数从宏传递给它。但是,假设我没有试图在参数中写入任何疯狂的内容\showcase(例如,括号始终是平衡的,我不太在意空格是否折叠,%里面没有 '),有没有办法定义这样的命令?

更新

\detokenize几乎完全符合我的要求。以下是示例

\newcommand\showcase[1]{{\ttfamily\detokenize{#1}} & $#1$}
\begin{tabular}{cc|cc}
\showcase{x^{y}}      & \showcase{\hat{x}, \bar{x}} \\
\showcase{x_{y}}      & \showcase{f\colon X \to Y} \\
\showcase{x'}         & \showcase{\sqrt{x+2}} \\
\showcase{x''_{2}}    & \showcase{2 < x \leq 4} \\
\showcase{A^{1}_{2}}  & \showcase{\frac{a+b}{c+d}} \\
\showcase{3\pi/4}     & \showcase{\int_{0}^{1} x^{2} \,dx} \\
\showcase{x\in\Omega} & \showcase{A \cup B \subseteq C \cap D}
\end{tabular}

输出结果如下:

在此处输入图片描述

我的小抱怨是:

  • 双人''似乎已经倒塌成一个"
  • 我发现控制序列后面的空格有点烦人。我知道它们为什么在那里,但如果有空格的话,有没有办法去掉它?不是后面跟着字母或数字?(或者,反过来,后面跟着{_

答案1

对于数学模式,这应该有效。

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\showcase}{v}
 {
  \texttt{#1} & \tl_rescan:nn { } { $#1$ }
 }
\ExplSyntaxOff

\begin{document}
\begin{tabular}{cc|cc}
\showcase{x^{y}}      & \showcase{\hat{x}, \bar{x}} \\
\showcase{x_{y}}      & \showcase{f\colon X \to Y} \\
\showcase{x'}         & \showcase{\sqrt{x+2}} \\
\showcase{x''_{2}}    & \showcase{2 < x \leq 4} \\
\showcase{A^{1}_{2}}  & \showcase{\frac{a+b}{c+d}} \\
\showcase{3\pi/4}     & \showcase{\int_{0}^{1} x^{2} \,dx} \\
\showcase{x\in\Omega} & \showcase{A \cup B \subseteq C \cap D}
\end{tabular}
\end{document}

在此处输入图片描述

如果您想要交换列,以便结果出现在代码之前,只需更改\showcase反转单元格的定义:

\NewDocumentCommand{\showcase}{v}
 {
  \tl_rescan:nn { } { $#1$ } &  \texttt{#1}
 }

在此处输入图片描述

答案2

我创建了\detokenizeplus,它可以去标记化但删除左括号和下划线前的空格,而这些正是您的示例的问题所在。此外,我删除了连续宏名称之间的空格(但只有当其名称前有空格时才能检测到第一个宏)。应该应用该功能的地方是在 之间\in\Omega。但是,由于\in紧接着x而不是空格,所以我的逻辑无法捕捉这种情况。因此,对于这个 MWE,我提出了一个论点x \in\Omega来测试我可以捕获连续的宏。

这里的逻辑是\getargsC将输入分解为空格分隔的参数(\argi,,,等等) \argii\argiii可以利用它来确定在按顺序重新输入参数时是否添加回空格。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{stringstrings}
\usepackage{readarray}
\newcommand\showcase[1]{{\ttfamily\detokenizeplus{#1}} & $#1$}
\def\firstchar#1#2|{#1}
% catcode=12 BACKSLASH
\edef\tbs{\detokenize{\X}}
\edef\tbs{\expandafter\firstchar\tbs|}
% catcode=12 LEFT BRACE
\edef\tlb{\detokenize{{}}}
\edef\tlb{\expandafter\firstchar\tlb|}
% catcode=12 UNDERSCORE
\edef\tus{\detokenize{_}}
\newcounter{index}
\newcommand\detokenizeplus[1]{%
  \def\temparg{\detokenize{#1}}%
  \getargsC{\temparg}%
  \setcounter{index}{0}%
  \def\prevmacro{F}%
  \whiledo{\value{index} < \narg}{%
    \stepcounter{index}%
%   DETERMINE IF A MACRO; REMOVE SPACE BETWEEN CONSECUTIVE MACROS
    \isnextbyte[q]{\tbs}{\csname arg\roman{index}\endcsname}%
    \if T\theresult%
      \if T\prevmacro\unskip\else\fi%
      \def\prevmacro{T}%
    \else%
      \def\prevmacro{F}%
   \fi%
%   REMOVE SPACES BEFORE LEFT BRACE
    \isnextbyte[q]{\tlb}{\csname arg\roman{index}\endcsname}%
    \if T\theresult\unskip\else\fi%
%   REMOVE SPACES BEFORE UNDERSCORES
    \isnextbyte[q]{\tus}{\csname arg\roman{index}\endcsname}%
    \if T\theresult\unskip\else\fi%
    \csname arg\roman{index}\endcsname~%
  }%
}
\begin{document}

\begin{tabular}{cc|cc}
\showcase{x^{y}}      & \showcase{\hat{x}, \bar{x}} \\
\showcase{x_{y}}      & \showcase{f\colon X \to Y} \\
\showcase{x'}         & \showcase{\sqrt{x+2}} \\
\showcase{x''_{2}}    & \showcase{2 < x \leq 4} \\
\showcase{A^{1}_{2}}  & \showcase{\frac{a+b}{c+d}} \\
\showcase{3\pi/4}     & \showcase{\int_{0}^{1} x^{2} \,dx} \\
\showcase{x \in\Omega} & \showcase{A \cup B \subseteq C \cap D}
\end{tabular}

\end{document}

在此处输入图片描述

相关内容