指南:什么时候 LaTeX3 会过多?

指南:什么时候 LaTeX3 会过多?

今天早上我发现自己正在写一篇文档,本质上是一样的文本重复多次。由于我最近一直在忙着学习 LaTeX3,所以完全没费什么心思,也没花什么时间就写了下面的代码片段。

\usepackage{xparse}
\ExplSyntaxOn
\newcommand{\tangentcount}[1]{
               \prg_case_int:nnn { #1 }
               {
                    { 2 } { exactly\ two }
                    { 1 } { exactly\ one }
               }
               { no }
}
\ExplSyntaxOff
\newcommand{\ietangents}[2]{%
    \tangentcount{#1} external and \tangentcount{#2} internal tangents.}

当然,这样写可能更好:

\NewDocumentCommand{\tangentcount}{ m }
    {
               \prg_case_int:nnn { #1 }
               {
                    { 2 } { exactly\ two }
                    { 1 } { exactly\ one }
               }
               { no }
    }

还值得注意的是,我可能可以做类似的事情

\usepackage{xparse}
\usepackage{xstring}
\NewDocumentCommand{\tangentcount}{ m }
    {%
        \IfEqCase{#1}{%
            {2}{exactly two}%
            {1}{exactly one}%
        }[no]%
    }

当然,我可以在 TeX 级别上做一些事情。但是要在 TeX 中构建一个切换函数?代码编写起来不够自然或不够快——我可能可以在弄清楚如何在 TeX 中完成切换所需的时间内编写整个文档。

现在这绝对是一份私人文件,由于上周的一个离题问题,我实际上只会在今天的课上使用,请原谅我的双关语。它可能只是留在我的硬盘上,很快就会被遗忘,再也不会被提及。所以在某种程度上,我怎么做真的不重要。

但我还是不禁想到,哪些是好的做法?

我没有写软件包:至少现在还没有。但谁知道呢?也许几个月后我会决定我真的想把所有这些小代码片段放在一起,用于我将公开发布甚至出版的东西。所有这些都引发了关于代码是否适合手头的任务以及我需要对代码进行多少潜在重构的问题。

目前看来,有些时候使用 LaTeX2e(甚至某些 TeX)可能是不可避免的。诸如胶水、绘图规则、设置字体、格式化文本、输入文件、创建框(或者可能是棺材的作用)之类的事情似乎超出了 LaTeX3 的当前范围。就我理解 LaTeX3 作者的理念而言,可能永远不会有明确的 LaTeX3 命令,例如\markup_text_bf:n

在上面的例子中,我更喜欢使用 LaTeX3 解决方案而不是使用xstring;不是因为我不喜欢xstring,而是因为当我已经在使用调用的宏和环境时,将整个包都塞进去似乎很愚蠢expl3。但这是好的做法吗?

那么,在决定何时应该使用 TeX、LaTeX2e 还是 LaTeX3 时,有哪些一般准则?

答案1

我相信这个很好的做法。当前 LaTeX3 内核中有数百个函数,可让宏程序员的工作更加轻松。

我不会像你一样使用如此戏剧性的缩进,我肯定会使用\NewDocumentCommand

\NewDocumentCommand{\tangentcount}{ m }
 {
  \int_case:nnn { #1 }
   {
    { 1 } { exactly ~ one }
    { 2 } { exactly ~ two }
   }
   { no }
 }

或者更好的是,

\NewDocumentCommand{\tangentcount}{ m }
 {
  \ellett_tangentcount:n { #1 }
 }
\cs_new:Npn \ellett_tangentcount:n #1
 {
  \int_case:nnn { #1 }
   {
    { 1 } { exactly ~ one }
    { 2 } { exactly ~ two }
   }
   { no }
 }

将用户命令与内部函数分开。这可以轻松扩展到任意数量的交叉点

\cs_new:Npn \ellett_tangentcount:n #1
 {
  \int_compare:nTF { #1 = 0 }
   { no }
   { exactly ~ \int_to_arabic:n { #1 } }
 }

注意在输出中使用~来表示空格,这比“控制空格”更可取。可以添加检查数字是否大于零。

还要注意,这\prg_case_int:nnn是当前函数的过时名称\int_case:nnn

为什么\cs_new:Npn?因为\int_compare:nTF\int_case:nnn函数在文档中用实心星号标记,所以它们是“完全可扩展的”,因此也\ellett_tangentcount:n可以在“纯扩展”环境中使用。

相关内容