我最近才了解到在 LaTeX 中排版文档时标记保持一致的重要性(将内容与格式分开 - 即“只需输入”)。 例如,
\emph
是一种语义标记,并不完全是以下内容的替代品\textit
:\emph 或 \textit- 使用
\vec
向量是一种很好的做法,并不是因为向量应该用箭头排版,而是因为我们可以自由地\vec
在以后重新定义它以按照我们的意愿出现:如何将所有 \vec{} 更改为 \bf{} - 有多种类型的
\dots
命令可用于不同的语义环境:\dots* 的区别
同样,我现在想知道定义一个自定义命令(例如\func
)用于函数标记是否好。例如,是否最好始终编写类似\(\func{f}(x), \func{g}(x_1, \dotsc, x_n)\)
而不是仅仅编写\(f(x), g(x_1, \dotsc, x_n)\)
?
我在发帖前搜索过这个网站,但没有找到任何关于这方面的专门讨论。这个有趣的问题是相关的,但它问的是如何这可以做到,而不是如果应该这样做:我如何通过自己的宏来影响数学函数的间距?
答案1
我花了数年时间思考如何让 TeX 数学语法更具语义,特别是在变量和函数表达式方面。最终,我的努力成果变成了这个软件包语义。它采用面向对象的数学方法,其中每个变量都属于一个类,并且使用 keyval 语法设置类。您可以查看以下语法:
\documentclass{article}
\usepackage{amsmath,semantex}
\NewVariableClass\MyVar % creates a new class of variables, called "\MyVar"
% Now we create a couple of variables of the class \MyVar:
\NewObject\MyVar\vf{f}
\NewObject\MyVar\vg{g}
\NewObject\MyVar\vh{h}
\NewObject\MyVar\vn{n}
\NewObject\MyVar\vp{p}
\NewObject\MyVar\vU{U}
\NewObject\MyVar\vx{x}
\NewObject\MyVar\sheafF{\mathcal{F}}
% Now we set up the class \MyVar:
\SetupClass\MyVar{
output=\MyVar, % This means that the output of an object
% of class \MyVar is also of class \MyVar
% We add a few keys for use with the class \MyVar:
define keys={ % we define a few keys
{inv}{upper={-1}},
{conj}{command=\overline}, % Applies \overline to the symbol
{inverse image}{upper={-1},no par},
},
define keys[1]={ % we define keys taking 1 value
{der}{upper={(#1)}},
{stalk}{sep lower={#1}},
% "sep lower" means "separator + lower", i.e. lower index
% separated from any previous lower index by a separator,
% which by default is a comma
{res}{ right return, symbol put right={|}, lower={#1} },
},
}
\begin{document}
$ \vf[conj,der=\vn] $
$ \vg[inv,res=\vU]{\vx} $
$ \vh[inverse image]{\sheafF}[spar,stalk=\vp]
= \sheafF[stalk=\vh{\vp}] $
\end{document}