我想将字符和的含义\d{}
从下点改为上点。也就是说,和分别表示和,但对于所有其他字符,其原始含义将保留。c
C
\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
,然后重新定义它来检查输入参数是否为c
或C
。
\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 包检查了这一点,并且成功了。