为了编写一些文档,我希望能够定义如下命令
\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}