记录错误

记录错误

使用\DeclareUnicodeEncoding,我定义了自己的编码,调整,\^使其映射到脱字符号 U+005E,而不是组合脱字符号 U+0302(xunicode 已将其设置为表示修改后的字母重音符 U+02C6)。

我遇到了一些困难/障碍/障碍。

  1. 第一个问题是由环境中出现的脱字符引起的,通过添加(with )listings解决了该问题。\input{tuenc.def}\makeatletter
  2. 第二个问题出现在输入时\^{},导致日志错误。

记录错误

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}

也许我们应该一直使用太空。我会向团队提出这个问题……

相关内容