使用\DeclareUnicodeEncoding
,我定义了自己的编码,调整,\^
使其映射到脱字符号 U+005E,而不是组合脱字符号 U+0302(xunicode 已将其设置为表示修改后的字母重音符 U+02C6)。
我遇到了一些困难/障碍/障碍。
- 第一个问题是由环境中出现的脱字符引起的,通过添加(with )
listings
解决了该问题。\input{tuenc.def}
\makeatletter
- 第二个问题出现在输入时
\^{}
,导致日志错误。
记录错误
file.log:505:Missing character: There is no in font [/usr/local/texlive/2016/texmf-dist/fonts/opentype/rozynski/comicneue/ComicNeue_Regular.otf]/OT:mapping=tex-text;!
代码
请参阅代码中的注释。请注意,我之所以选择 ComicNeue_Regular.otf,是因为它不支持 U+0302 或 U+00A0,并且它包含在 TeX Live 中。
\documentclass{article}
\usepackage{fontspec}
\usepackage{listings}
\makeatletter
\DeclareUnicodeEncoding{preventcombinedcircumflex}{
\input{tuenc.def}
\EncodingAccent{\^}{"005E}
}%
\makeatother
\setmainfont[
Path = /usr/local/texlive/2016/texmf-dist/fonts/opentype/rozynski/comicneue/ ,
Extension = .otf ,
UprightFont = *_Regular,
NFSSEncoding= preventcombinedcircumflex,
]{ComicNeue}
\begin{document}
% Solved the general issue by adding \EncodingAccent{\^}{"005E}, or so I thought.
\^2
% Solved the lstlisting issue was solved by adding \makeatletter\input{tuenc.def}
\begin{lstlisting}
|^2
\end{lstlisting}
% Unsolved
\^{}
\end{document}
笔记
- 这是对另一个问题的后续回答: 为什么日志条目会抱怨源代码中没有的脱字符?
答案1
如果你添加
\catcode160=15
然后你会发现
(/usr/local/texlive/2017/texmf-dist/tex/latex/base/tuenc.def
! Text line contains an invalid character.
l.84 \if\relax\detokenize{#2}\relax
\else#2\fi
?
这很有趣,翻译过来就是:这不是你的错。
令人反感的台词是
\if\relax\detokenize{#2}\relax^^a0\else#2\fi
意思是如果 accent 命令的参数为空,则使用不间断空格。你需要某物因为当使用unicode组合字符时,您不想a\"{}
将重音放在上面,a
因为后面的组合字符没有可以作用的基础。
但你的例子表明使用 并不安全^^a0
。不要tuenc.def
输入本地副本,而是输入
\def\add@unicode@accent#1#2{%
\if\relax\detokenize{#2}\relax^^a0\else#2\fi
\char#1\relax}
已改为(我猜)
\def\add@unicode@accent#1#2{%
\if\relax\detokenize{#2}\relax\space\else#2\fi
\char#1\relax}
也许我们应该一直使用太空。我会向团队提出这个问题……