回忆录课中的希腊字母大小写匹配

回忆录课中的希腊字母大小写匹配

我使用宏文件编写了一些文档,以便更轻松地编写数学公式。在其中一些宏中,我使用了在数学模式下将 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
  • 包括amsmathamstext能够将文本模式命令插入为数学符号
  • 在文本模式下渲染希腊字母,并包裹在\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使用\MakeUppercasetextcase包修改的,这意味着忽略数学符号大写。

您可以使用不同的方法获得相同的结果,而不依赖于\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因此替换文本中没有该内容。

相关内容