如何在 LaTeX 中编写带有下标的数学闭包?

如何在 LaTeX 中编写带有下标的数学闭包?

目前,我正在用 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}

相关内容