什么原因导致 È 无法正确格式化?

什么原因导致 È 无法正确格式化?

我正在使用以下包:https://github.com/franen/matrita

有一个\rispostatutti命令定义如下:

\newcommand{\rispostatutti}[1]{%
 \par\nobreak\vspace{\prerisp}%
 \noindent\respindent\respsym\ {\respfont#1}\par%
 \vspace{\postrisp}%
}

此命令会阻止正确呈现字母È。事实上,写作

\rispostatutti{\`E cosa buona e giusta.}

返回以下内容:

在此处输入图片描述

为什么第二个\`E格式正确,而第一个却不正确?

MWE 重现该问题:

  1. 克隆https://github.com/franen/matrita
  2. latex matrita.dtx
  3. 转到第 997 行matrita.sty,将Ès改为\`Es
  4. pdflatex Esempio3.tex
  5. 转到 Esempio3.pdf 第 19 页并检查

顺便说一句,如果我不将Ès 更改为\`Es,我会收到以下错误:

! Package inputenc Error: Unicode char �\check@icr (U+3DB)
(inputenc)                not set up for use with LaTeX.

See the inputenc package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.207 \prefazio

? 

! Package inputenc Error: Keyboard character used is undefined
(inputenc)                in inputencoding `utf8'.

答案1

Esempio3.tex; 以下行有错误

\renewcommand{\respfont}{\textbf}

应该

\renewcommand{\respfont}{\bfseries}

这是修复并重新编译后的输出:

在此处输入图片描述

包中的命令定义为

\newcommand{\respfont}{\itshape}

这与声明一样正确\itshape。相反,\textbf是带有参数的命令,并且在您使用它的上下文中,它要么以\`UTF-8 表示中的第一个八位字节为参数È;在这两种情况下都会发生错误。

答案2

(我猜你的评论意味着我的评论解决了你的问题,:-)所以我会把它写成一个正确的答案。)

一些命令会尝试抓取其后的第一个字母来应用一些特殊格式。似乎正在\respfont使用 .¹ 参数执行此操作。\rispostatutti如果第一个“字母”不是单个标记,则需要分组,因此您需要

\rispostatutti{{\`E} cosa buona e giusta.}

inputenc还需要对 UTF-8 字符进行分组:

\rispostatutti{{È} cosa buona e giusta.}

这是因为È在常规 LaTeX 中,它实际上被视为两个八位字节。如果不进行分组,则只会抓取第一个八位字节(这会破坏编码)。如果您使用具有原生 UTF-8 支持的 XeLaTeX 或 LuaLaTeX,则它È是一个单个标记,不会造成问题。

(这与UTF-8手册的部分mfirstuc,因为\makefirstuc同样尝试抓取其参数的首字母来对其进行大小写更改。)


¹ 或者,如果需要将字体更改应用于整个参数,则需要将的定义\rispostatutti更改为使用,\respfont{#1}而不是。\respfont #1

相关内容