目前,我正在用 bar 编写闭包,例如\bar{\Omega}
。也许有更好的方法,但它看起来或多或少还可以。
当我想定义例如时,问题就开始了:
\newcommand{\cellFluid}{Y}
\newcommand{\cellSolid}{\cellFluid_0}
现在\bar{\cellSolid}
看起来很丑陋,我不得不使用\bar{\cellFluid}_0
它,这违背了定义的意义\cellSolid
并使代码难以阅读。
我怎么解决这个问题?
答案1
您隐含地期望可以统一排版任何公式的闭包,这是因为您误将 TeX 视为标记系统,而实际上它是一种排版系统。通常,您可以忽略这两个概念之间的区别,而 LaTeX 尤其模糊了这两个概念。但是,当涉及到排版数学时,不可能假设这两个概念是相同的(请参阅 MathML 如何区分表示和语义)。
为了解决您的问题,请在\cellFluid
宏定义附近添加一个新的定义,用于\cellFluidBar
对闭包进行排版
\cellFluid
。
或者,您可以寻找闭包的替代符号,例如 $\mathop{\mathrm{Adh}}_X Y_0$,这些符号虽然繁琐,但可以平滑标记和排版之间的界限。
如果您喜欢 TeX 编程,您可以设计一个\closure
宏,它接受一个唯一参数并以通用方式排版其闭包,但支持异常字典。除了乐趣之外,与第一个简单直接的解决方案相比,它的好处可能微乎其微。
答案2
这是我的解决方案。它完美地完成了工作,但
\closure{poreSkeleton}
用来代替更优雅的\closure{\poreSkeleton}
。如果有人知道提供类似功能的软件包,或者这种方法可能存在问题,请告诉我。
\documentclass{article}
\usepackage{xargs}
\usepackage{etoolbox}
% ———begin setup———————————————————————————————————————————————————————————————————
\makeatletter
\newcommand\constructor[2]{
\expandafter\newcommandx\csname #1\endcsname[1][1=]{\ifstrequal{##1}{}
{#2}
{\@ifundefined{#1@##1}
{\errmessage{"#1" has no field named "##1"}}
{\@nameuse{#1@##1}}
}
}
\@namedef{#1@self}{#2}
}
\newcommand\set[3]{ % this, field, value
\@namedef{#1@#2}{#3}
}
\newcommand\newcommandWithIndex[3]{
\constructor{#1}{#2#3}
\set{#1}{body}{#2}
\set{#1}{index}{#3}
}
\newcommand{\closure}[1]{
\@ifundefined{#1@body}
{\bar{#1}}
{\bar{\@nameuse{#1@body}}\@nameuse{#1@index}}
}
\makeatother
% ———end setup—————————————————————————————————————————————————————————————————————
\newcommandWithIndex{poreSkeleton}{\Omega}{_0^\varepsilon}
\begin{document}
\begin{tabular}{ll}
Plain: & $\poreSkeleton$ $\Omega_0^\varepsilon$\\
Messy closure: & $\bar{\poreSkeleton}$ $\bar{\Omega_0^\varepsilon}$\\
Proper closure: & $\closure{poreSkeleton}$ $\bar{\Omega}_0^\varepsilon$
\end{tabular}
\end{document}