我最近对“语义”很感兴趣。例如,过去我可能会将两个向量空间的直接和写成$V\oplus W$
,但现在我将其定义\newcommand{\directsum}{\oplus}
为$V\directsum W$
。我真的很喜欢这种审美方式(以这种方式编写代码很有意义),而且由于它表达了它的含义,因此更容易阅读代码。
我现在遇到的问题可能是所有标记语言都存在的一个问题。如果我想编写能够完全反映所写内容含义的语义代码,并将尽可能多的格式分流到序言中,那么似乎我必须提前决定很多事情,而这样做实际上会失去灵活性(或者至少会让事情变得更加难以改变)。
例如,假设我想为函数“foo”创建一个命令。假设有些人喜欢使用括号,并写foo(x)而其他人则喜欢省略括号,并写富 x。
问题是:如果我在序言中定义
\newcommand{\foo}{\mathrm{foo}}
并\foo(x)
在我的文档中全部写上,那么即使有人更改定义以使用\operatorname
,他们也必须仔细检查并删除我的所有括号。这不可能是合适的 LaTeX;我们应该能够避免这种情况。
因此我决定做出一个包含论点的定义:
\newcommand{\foo}[1]{\mathrm(#1)}
这似乎好多了;现在,我会\foo{x}
在文档中写,不想要括号的人只需在我的定义中删除一次即可。但现在的问题是,这极大地限制了我控制括号格式的能力。
例如,如果我在显示方程中想要写入\foo{\frac{1}{2}}
,那我就没那么幸运了;括号对于分数来说太小了。如果我尝试通过在定义中包含\left
和来解决这个问题\right
,那么相反,有时括号会比我想要的要大。
在我看来,唯一剩下的选择就是让我定义\foo
有星号的版本/额外的选项,让我能够控制这一点,例如
\newcommand{\foo}[2][]{\mathrm{foo}#1(#2#1)}
或者
\makeatletter
\def\foo{\@ifstar\@foo\@@foo}
\def\@foo#1{\mathrm{foo}\left(#1\right)}
\def\@@foo#1{\mathrm{foo}(#1)}
\makeatother
这似乎违背了语义化的目的。不再\foo{x}
会出现格式正确的情况foo(x)无论X是;有时我需要改变一些其他的,辅助的参数来\foo
获取我想要的格式。
好吧,抱歉这么长的一个开场白,但这个问题困扰了我一段时间,我想表达一下我目前的想法。我的问题是:
我是否应该尝试将我想要修改格式的所有方法
\foo
作为可选参数纳入其定义?还是应该将所有临时格式决定留在文档正文中,未来的编辑者们见鬼去吧?
我意识到这有点主观,但这确实是我面临的一个问题,我想很多人也面临同样的问题,所以我希望这个问题不会被关闭。如果有人对如何编辑这个问题以使其更合适提出建议,我将非常欢迎。
答案1
我认为不可能在广泛的学科范围内实现纯语义标记(或者至少在不放弃格式控制或至少将其与文档创作阶段更彻底地分开的情况下)。在数学的 XML 标记中,您会看到同样的二分法,一边是 OpenMath/Content-MathML,另一边是 Presentation-MathML。
我认为对于特定主题领域的手写 LaTeX 可以定义一些一致的输入样式。如今的一个重大选择是坚持使用经典的 TeX 标记方法\alpha^2
还是涉足 Unicode 输入,α²
我假设是前者,但想提一下后者的可能性。
我不会引入太多*
形式和位置[]
参数,因为它们很难记住,而且不会真正提高可读性。一种可能有效的方法是始终为命令提供一个可选的键值可选参数。这样,您就可以扩展语法可能性,而无需更改现有文档。
所以
\foo{x} foo(x) % using \mathop not just \mathrm to get prefix spacing
\foo[paren=none]{x} foo x % like \sin x
\foo[paren=auto]{x} foo\left(x\right)
\foo[paren=Big]{x} foo\Bigl(x\Bigr)
\foo[tizdecoration=big pink circle] {x} % .. whatever it takes:-)
关键在于您可以考虑新的关键字并将它们添加到部分或全部命令中,而不会破坏现有文档,并且从语义上讲,您始终可以忽略可选参数中的内容(这只是一个样式钩子)。