改变 \d 的含义为一个字符

改变 \d 的含义为一个字符

我想将字符和的含义\d{}从下点改为上点。也就是说,和分别表示和,但对于所有其他字符,其原始含义将保留。cC\d{c}\d{C}\.c\.C\d{}

我可以使用\renewcommand{\d}{...}来做到这一点,但我意识到重新定义 \d{} 是有风险的。更糟糕的是,我使用的是“hyperref”包,它\d{}在内部重新定义。即使我确实重新定义\d{},hyperref 也会覆盖我的重新定义,因为它是最后加载的。

我可以遍历我的文件,并使用 vim 中的全局替换将所有内容更改为,但文件太多,每个文件中都有数百个替换。我冒着引入错误的风险\d{c}\.c

有没有简单的方法可以做到这一点?我正在使用带有 fontspec 包的 XeLaTeX。任何建议都将不胜感激。

答案1

您可以使用现有的复合重音机制来重新定义 T1 的复合重音(或您正在使用的任何编码)

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}
\DeclareTextCompositeCommand{\d}{T1}{c}{\.c}
\DeclareTextCompositeCommand{\d}{T1}{C}{\.C}
\begin{document}

\d{c}\d{C}\d{u}
\end{document}

或使用 PU 编码作为书签

\usepackage[T1]{fontenc}
\DeclareTextCompositeCommand{\d}{T1}{c}{\.c}
\DeclareTextCompositeCommand{\d}{T1}{C}{\.C}
\usepackage{hyperref}
\DeclareTextCompositeCommand{\d}{PU}{c}{\.c}
\DeclareTextCompositeCommand{\d}{PU}{C}{\.C}
\begin{document}

\d{c}\d{C}\d{u}

\section{section{\d{c}\d{C}\d{u}}}

\end{document}

当然,使用 xetex 时,你会使用 TU 而不是 T1 编码,因此

\documentclass{article}

\DeclareTextCompositeCommand{\d}{TU}{c}{\.c}
\DeclareTextCompositeCommand{\d}{TU}{C}{\.C}
\usepackage{hyperref}
\DeclareTextCompositeCommand{\d}{PU}{c}{\.c}
\DeclareTextCompositeCommand{\d}{PU}{C}{\.C}
\begin{document}

\d{c}\d{C}\d{u}

\section{section{\d{c}\d{C}\d{u}}}

\end{document}

答案2

我不确定这是否真的是个好主意,而且我当然主张修复输入(您可以通过编程方式执行一次并仅匹配\d{c}\d{C})。

但是,下面复制了 的定义\d,然后重新定义它来检查输入参数是否为cC

\documentclass[]{article}

\ExplSyntaxOn
\AtBeginDocument
  {
    \NewCommandCopy \ajya_orig_d:n \d
    \RenewDocumentCommand \d { m }
      {
        \bool_lazy_or:nnTF
          { \str_if_eq_p:nn {#1} { c } }
          { \str_if_eq_p:nn {#1} { C } }
          { \. {#1} }
          { \ajya_orig_d:n {#1} }
      }
  }
\ExplSyntaxOff

\usepackage{hyperref}

\begin{document}
\d{a}\d{c}
\end{document}

答案3

我不确定你为什么要这样做,但你可能有一些理由。

您想确保书签也以相同的方式处理。

\documentclass{article}
\usepackage{fontspec}
\usepackage[unicode]{hyperref}

\ExplSyntaxOn
\cs_new_eq:NN \ajya_d_old:n \d
\cs_new:Nn \ajya_d_new:n
 {
  \str_case:nnF { #1 }
   {
    {c}{\.{#1}}
    {C}{\.{#1}}
    % maybe some other cases
   }
   {
    \ajya_d_old:n { #1 }
   }
 }
\DeclareDocumentCommand{\d}{m}{\ajya_d_new:n {#1}}
\pdfstringdefDisableCommands
 {
  \cs_set_eq:NN \d \ajya_d_new:n
 }
\ExplSyntaxOff


\begin{document}

\d{c}\d{C}\d{u}

\section{\d{c}\d{C}\d{u}}

\end{document}

在此处输入图片描述

答案4

为了正确执行此操作,您可以为特定字符创建显式的 overdot 命令,检查给定字符是否存在这样的函数,如果存在则调用它。否则,如果不存在这样的函数,您需要为所有非“C”场景维护原始命令 \d{}:

%copy \d so standard functionality isn't lost
\global\let\oldD\d

%create new function for overdot 'C'
\global\newcommand{\dC}{%
    \.{C}\ignorespaces
}

%create new function for overdot 'c'
\global\newcommand{\dc}{%
    \.{c}\ignorespaces
}

%redefine \d to do \oldD unless an explicit command exists
%in this case, \dC
\global\renewcommand{\d}[1]{%
    \ifcsname d#1\endcsname
        \csname d#1\endcsname\ignorespaces
    \else
        \oldD{#1}\ignorespaces
    \fi
}

\begin{document}

\d{F}|\d{c}|\d{C}|\d{u}

\end{document}

输出:

在此处输入图片描述

上述方法允许您根据需要概述其他特定字符功能,同时将原始功能(由 hyperref 重新定义)保留为默认值。

我使用序言中的重新定义和 hyperref 包检查了这一点,并且成功了。

相关内容