我最近了解到一个\DeclareUnicodeAccent
可以声明变音符号的命令,该命令会被打印出来后声明命令的参数。例如
\documentclass{article}
\usepackage{fontspec}
\setmainfont{CharisSIL}
\DeclareUnicodeAccent{\foo}{TU}{"031F} % ̟
\begin{document}
\foo{b}
\end{document}
生产b̟
-
现在我想要一个类似的命令来连接变音符号。它应该以这样的方式声明命令,即变音符号将放置在其参数的第一个和第二个字符之间。一个虚拟(不起作用)代码如下。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{CharisSIL}
\DeclareUnicodeConjoiningDiacritic{\bar}{TU}{"0361} % ͡
\begin{document}
\bar{ab}
\end{document}
须出示a͡b
——
在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}