我使用宏文件编写了一些文档,以便更轻松地编写数学公式。在其中一些宏中,我使用了在数学模式下将 MakeUppercase 应用于非英文字符在希腊字母上使用 \MakeUppercase 和 \MakeLowercase。
现在,当我尝试将这些文档收集到一篇论文中时,问题就出现了。我已将其缩小到与文档类是回忆录(或者更确切地说,论文类使用)有关\LoadClassWithOptions{memoir}
。
梅威瑟:
\documentclass{article}
%\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage{xifthen}
\usepackage{xargs}
%%%Greek letter case matching%%%
\makeatletter
\g@addto@macro\@uclclist{%
\delta\Delta
\tau\Tau
}
\newcommand\Tau{\mathrm{T}}
%Math macros%
\newcommandx\setnamestyle[1]
{
\ifcat\noexpand#1\relax % use mathcal unless control sequence (greek letter)
\MakeUppercase{#1} %greek letter or multiple chars
\else
\mathcal{\MakeUppercase{#1}} % single char
\fi
}
\newcommandx\set[2]
{
% set (uppercase)
\expandafter\DeclareRobustCommand\csname#1set\endcsname{\ensuremath{
\setnamestyle{#2}
}}
% element of set (lowercase)
\expandafter\newcommandx\csname#1\endcsname{\ensuremath{
\MakeLowercase{#2}
}}
% element in set
\expandafter\newcommand\csname#1inset\endcsname{\ensuremath{
\csname#1\endcsname \in \csname#1set\endcsname
}}
% sum of elements in set
\expandafter\newcommand\csname#1sum\endcsname{\ensuremath{
\sum_{\csname#1inset\endcsname}
}}
}
\begin{document}
\set{testSetA}{A}
\testSetA\qquad\testSetAinset\qquad\testSetAsum
\set{testSetTau}{\Tau}
\testSetTau\qquad\testSetTauinset\qquad\testSetTausum
\set{testSetDelta}{\delta}
\testSetDelta\qquad\testSetDeltainset\qquad\testSetDeltasum
\end{document}
使用文章文档类可获得预期结果:
而当使用回忆录类时,希腊字母不能被正确处理:
如果您能提供任何关于如何解决此问题的见解,我们将不胜感激。
答案1
一种可能性是重写您的文档以使用 Unicode 和 expl3,这将为您提供一些更好的原语。(预计到达时间:我看到@egreg 继续写了那个。)但是,在 PDFTeX 中使其工作的最小修复是:
- 包括,
alphabeta
以便,等在文本模式下定义并对其进行处理\alpha
\Tau
\MakeUppercase
\MakeLowercase
- 包括
amsmath
或amstext
能够将文本模式命令插入为数学符号 - 在文本模式下渲染希腊字母,并包裹在
\textnormal
\documentclass{memoir}
\usepackage[LGR, T1]{fontenc}
\usepackage{amsmath}
\usepackage{alphabeta}
\usepackage{xifthen}
\usepackage{xargs}
%Math macros%
\newcommandx\setnamestyle[1]
{
\ifcat\noexpand#1\relax % use mathcal unless control sequence (greek letter)
\mathord{\textnormal{\MakeUppercase{#1}}} %greek letter or multiple chars
\else
\mathcal{\MakeUppercase{#1}} % single char
\fi
}
\newcommandx\set[2]
{
% set (uppercase)
\expandafter\DeclareRobustCommand\csname#1set\endcsname{\ensuremath{
\setnamestyle{#2}
}}
% element of set (lowercase)
\expandafter\newcommandx\csname#1\endcsname{\ensuremath{
\mathord{\textnormal{\itshape\MakeLowercase{#2}}}
}}
% element in set
\expandafter\newcommand\csname#1inset\endcsname{\ensuremath{
\csname#1\endcsname \in \csname#1set\endcsname
}}
% sum of elements in set
\expandafter\newcommand\csname#1sum\endcsname{\ensuremath{
\sum_{\csname#1inset\endcsname}
}}
}
\begin{document}
\set{testSetA}{A}
\testSetA\qquad\testSetAinset\qquad\testSetAsum
\set{testSetTau}{\Tau}
\testSetTau\qquad\testSetTauinset\qquad\testSetTausum
\set{testSetDelta}{\delta}
\testSetDelta\qquad\testSetDeltainset\qquad\testSetDeltasum
\end{document}
列出文档中的字体会显示这在技术上使用的是 LGR 编码的文本字体,而不是 OML 或 OT1 编码的数学字体,但对于默认字体系列,大多数字形都是相同的。您可能会遇到一些字母的问题,例如\lambda
和。如果您需要修复此问题,请认真考虑使用 expl3 方法\vartheta
。\varphi
如果您希望能够在源代码中插入希腊语 UTF-8 字符,则可以在 expl3 中实现这一点,但我保持该部分代码不变。
答案2
问题是memoir
使用\MakeUppercase
由textcase
包修改的,这意味着忽略数学符号大写。
您可以使用不同的方法获得相同的结果,而不依赖于\MakeUppercase
或\MakeLowercase
。
老实说,我认为输入类似的\SetAsum
而不是这样的内容不会给你带来太多好处,\sum_{a\in A}
而且会失去灵活性,因为你不能这样做\sum_{a'\in A}
。
%\documentclass{article}
\documentclass{memoir}
\providecommand\Tau{\mathrm{T}}
\ExplSyntaxOn
%Math macros
\cs_new_protected:Nn \rasmus_set_namestyle:n
{
\token_if_cs:NTF #1 { #1 } { \mathcal{#1} }
}
\NewDocumentCommand{\set}{mm}
{
\cs_new_protected:cpn { #1set }
{
\rasmus_set_namestyle:n { #2 }
}
% element of set (lowercase)
\cs_new_protected:cpx { #1 }
{
\token_if_cs:NTF { #2 }
{
\exp_not:c { \str_lowercase:f { \cs_to_str:N #2 } }
}
{
\str_lowercase:n { #2 }
}
}
% element in set
\cs_new_protected:cpx { #1inset }
{
\exp_not:c { #1 } \exp_not:N \in \exp_not:c { #1set }
}
% sum of elements in set
\cs_new_protected:cpx { #1sum }
{
\exp_not:n { \sum\sb } { \exp_not:c { #1inset } }
}
}
\ExplSyntaxOff
\begin{document}
\set{testSetA}{A}
$\testSetA\qquad\testSetAinset\qquad\testSetAsum$
\set{testSetTau}{\Tau}
$\testSetTau\qquad\testSetTauinset\qquad\testSetTausum$
\set{testSetDelta}{\delta}
$\testSetDelta\qquad\testSetDeltainset\qquad\testSetDeltasum$
\end{document}
我删除了所有\ensuremath
只会增加复杂性的部分。能够\SetDelta
在文本模式下输入并不比在语义模式下输入更经济$\SetDelta$
。
注意:如果我要求 LaTeX 显示命令的定义
\texttt{\meaning\testSetDelta}
\texttt{\meaning\testSetDeltainset}
\texttt{\meaning\testSetDeltasum}
我明白了
\csname
因此替换文本中没有该内容。