理解 \add@unicode@accent 并更新它以连接变音符号

理解 \add@unicode@accent 并更新它以连接变音符号

我最近了解到一个\DeclareUnicodeAccent可以声明变音符号的命令,该命令会被打印出来声明命令的参数。例如

\documentclass{article}
\usepackage{fontspec}
\setmainfont{CharisSIL}
\DeclareUnicodeAccent{\foo}{TU}{"031F} % ̟

\begin{document}
\foo{b}
\end{document}

生产-

1

现在我想要一个类似的命令来连接变音符号。它应该以这样的方式声明命令,即变音符号将放置在其参数的第一个和第二个字符之间。一个虚拟(不起作用)代码如下。

\documentclass{article}
\usepackage{fontspec}
\setmainfont{CharisSIL}
\DeclareUnicodeConjoiningDiacritic{\bar}{TU}{"0361} % ͡

\begin{document}
\bar{ab}
\end{document}

须出示a͡b——

2

source2e.pdf我发现了以下定义\DeclareUnicodeAccent(这很容易理解),但我不明白\add@unicode@accent必须更新其定义才能正确产生结果。

\def\add@unicode@accent#1#2{%
  \if\relax\detokenize{#2}\relax^^a0\else#2\fi
  \char#1\relax}
\def\DeclareUnicodeAccent#1#2#3{%
  \DeclareTextCommand{#1}{#2}{\add@unicode@accent{#3}}%
}

我想了解\add@unicode@accent我想要开发的命令到底起什么作用以及如何更新它。

答案1

这是一个实现:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Doulos SIL}

\NewDocumentCommand{\conjoining}{m >{\SplitArgument{1}{}}m}{%
  \makeconjoining{#1}#2%
}
\NewDocumentCommand{\makeconjoining}{mmm}{%
  #2\symbol{"#1}#3%
}
\NewDocumentCommand{\doubleinvertedbreve}{m}{%
  \conjoining{0361}{#1}%
}

\begin{document}

\doubleinvertedbreve{ab}
\doubleinvertedbreve{AB}
\doubleinvertedbreve{aB}
\doubleinvertedbreve{Ax}

\end{document}

在此处输入图片描述

做什么\DeclareUnicodeAccent

\def\DeclareUnicodeAccent#1#2#3{%
  \DeclareTextCommand{#1}{#2}{\add@unicode@accent{#3}}%
}

它是一个接口\DeclareTextCommand,因此

\DeclareUnicodeAccent{\foo}{TU}{<number>}

是相同的

\DeclareTextCommand{\foo}{TU}{\add@unicode@accent{<number>}}

因此,如果当前编码是TU,则命令\foo{x}将执行

\add@unicode@accent{<number>}{x}

的定义\add@unicode@accent非常简单:

\def\add@unicode@accent#1#2{%
  \if\relax\detokenize{#2}\relax^^a0\else#2\fi
  \char#1\relax}

这意味着如果第二个参数为空,则插入字符 U+00A0,后跟\char<number>\relax

这根本就不是您所寻找的。

答案2

egreg 对答案进行了小幅修改,以降低重音,以防两个字母都很小(即没有上升部分)。它的工作原理是测量参数的高度,并计算此高度与组合 AX 的高度之间的差异。

\documentclass{article}
\usepackage{fontspec}
\usepackage{calc}
\setmainfont{DejaVu Serif}
\newdimen\conjh
\newdimen\upperh
\NewDocumentCommand{\conjoining}{m >{\SplitArgument{1}{}}m}{%
  \makeconjoining{#1}#2%
}
\NewDocumentCommand{\makeconjoining}{mmm}{%
  \settoheight{\upperh}{AX}%
  \settoheight{\conjh}{#2#3}%
  #2\raisebox{\conjh-\upperh}{\symbol{"#1}}#3%
}
\NewDocumentCommand{\doubleinvertedbreve}{m}{%
  \conjoining{0361}{#1}%
}

\begin{document}

\doubleinvertedbreve{ab}
\doubleinvertedbreve{AB}
\doubleinvertedbreve{aB}
\doubleinvertedbreve{Ax}
\doubleinvertedbreve{ax}

\Huge
\doubleinvertedbreve{ab}
\doubleinvertedbreve{AB}
\doubleinvertedbreve{aB}
\doubleinvertedbreve{Ax}
\doubleinvertedbreve{ax}

\end{document}

在此处输入图片描述

答案3

您需要在 TeX 原始级别执行的操作如下:

\def\bar#1{\barA#1}
\def\barA#1#2{\setbox0=\hbox{#1#2}\dimen0=\ht0
   \ifdim\dimen0>1ex \advance\dimen0 by-1ex \else \dimen0=0pt \fi
   #1\raise\dimen0\hbox{\char"0361}#2%
}  

\bar{aB}

相关内容