TeX 点命令

TeX 点命令

我尝试让我的命令能够以标准德语符号输出一个点。

我的代码(改编版wipet 的代码):

\documentclass[12pt]{article}

\def\punkt#1{\left(\punktA#1,,\right)}
\def\punktA#1,{\if,#1,\else #1\vert\expandafter \punktA \fi}

\begin{document}
$\punkt{\frac{1}{\pi},2,3}$
\end{document}

出现了两个问题:

  1. 我如何去掉“3”后面的最后一条竖线?
  2. 我怎样才能自动将垂直条缩放到最大的输入?

答案1

在此处输入图片描述

使用 LaTeX 的内置逗号列表处理更加容易。

\documentclass[12pt]{article}

\ExplSyntaxOn
\NewDocumentCommand\punkt{m}{
\left(
\clist_use:nn{#1}{\middle|}
\right)}
\ExplSyntaxOff
\begin{document}
$\punkt{\frac{1}{\pi},2,3}$
\quad
$\punkt{\frac{\frac{a}{b}}{\frac{a}{b}},2,3}$
\end{document}

正如 Mico 所说,如果留出一些空间的话看起来会更好:

在此处输入图片描述

\NewDocumentCommand\punkt{m}{
\left(\,
\clist_use:nn{#1}{\;\middle|\;}
\,\right)}

答案2

代码一开始就是错的(我的意思是原始代码),因为它使用的\if,#1,不是对 是否为空的安全测试#1。问题是\if扩展了标记;在你的情况下它可以工作,因为 的扩展\frac不以逗号开头。但如果在不同的上下文中使用类似的代码,可能会出现问题。

您希望首先处理逗号分隔列表中的第一个项目,然后开始递归,其中\middle|放置其它項目。

\documentclass[12pt]{article}

\def\punkt#1{\left(\punktA#1,,\right)}
\def\punktA#1,{#1\punktB}
\def\punktB#1,{%
  \if\relax\detokenize{#1}\relax % safe test for emptiness
    % do nothing in the true case
  \else
    \,\middle|\,#1% delimiter and item
    \expandafter\punktB % restart the recursion
  \fi
}

\begin{document}

$\punkt{}$

$\punkt{a}$

$\punkt{a,b}$

$\punkt{\frac{1}{\pi},2,3}$

\end{document}

在此处输入图片描述

您会发现它也适用于空参数。

当然,这种\clist_use:nn方法David 建议更加简单并且几乎不需要思考。

使用更自然的输入语法:

\documentclass[12pt]{article}

\ExplSyntaxOn

\NewDocumentCommand{\punkt}{m}
 {
  \left(
  \seq_set_split:Nnn \l_tmpa_seq { | } { #1 }
  \seq_use:Nn \l_tmpa_seq { \,\middle|\, }
  \right)
 }

\ExplSyntaxOff

\begin{document}

$\punkt{}$

$\punkt{a}$

$\punkt{a|b}$

$\punkt{\frac{1}{\pi} | 2 | 3}$

\end{document}

输出相同。周围的空格|将被忽略。

答案3

在实践中,我建议遵循 David Carlisle 提供的答案。

但也许 - 作为一个没有实际意义的观点/作为“学术事物” - 你希望知道如何自己实现一个循环,\PunktA它不会在逗号列表的最后一项后面添加竖线:

您可以\punktA处理两个参数,而不仅仅是一个。
第一个参数是未分隔的/嵌套在和之间的{...},表示要添加到此迭代中处理的逗号列表项前面的标记。在第一次迭代中,它是空的。在后续迭代中,它包含\;\middle|\;
第二个参数是逗号分隔的,表示此迭代中处理的逗号列表项:

\documentclass[12pt]{article}

\def\punkt#1{\left(\,\punktA{}#1,,\,\right)}
\def\gobble#1{}
\def\punktA#1#2,{\if,#2,\expandafter\gobble\else #1#2\expandafter\punktA\fi{\;\middle|\;}}

\begin{document}
$\punkt{\frac{1}{\pi},2,3}$
\end{document}

在此处输入图片描述


这也许也能起到作用:

\documentclass[12pt]{article}

\def\separator{\;\middle|\;}
\def\punkt#1{\left(\,\punktA\empty#1,,\,\right)}
\def\punktA#1,{\ifx#1\separator\else #1\expandafter\punktA\expandafter\separator\fi}

\begin{document}
$\punkt{\frac{1}{\pi},2,3}$
\end{document}

在此处输入图片描述

相关内容