定义 unicode 字符的替换

定义 unicode 字符的替换

在我的自动生成的 tex 文件中,有不少“替换字符”0xEFBFBD(参见:http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280我有以下代码:

\documentclass{book}

\usepackage[utf8]{inputenc}

\begin{document}
\ttfamily
Here follows the "Replacement character": � (EFBFBD).
\end{document}

(替换字符的显示取决于所选的编码,在此编辑器 ANSI 编码中我看到 �。当使用 vim 时我看到 �)。

在包含以下字符的文件上运行 pdflatex(这是 pdfTeX,版本 3.14159265-2.6-1.40.19(MiKTeX 2.9.6650 64 位))时,我收到错误消息:

! Package inputenc Error: Unicode char � (U+FFFD)
(inputenc)                not set up for use with LaTeX.

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

l.7 Here follows the "Replacement character": �
                                                  (EFBFBD).

运行 xelatex(这是 XeTeX,版本 3.14159265-2.6-0.99999(MiKTeX 2.9.6650 64 位))时生成了一个 pdf,但没有任何显示: 在此处输入图片描述 在@StevenB.Segletes 对该问题的回答中标准 TeX 中的 Unicode 替换字符显示出了一个漂亮的字符(我在输出代码中根据我的需要对它进行了稍微的调整):

\documentclass{book}

\usepackage[utf8]{inputenc}
\usepackage{adjustbox,amssymb,graphicx,stackengine,xcolor}
\newlength{\CodeWidthChar}
\newlength{\CodeHeightChar}
\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
   \textcolor{white}{\sffamily\bfseries\small ?}}{%
   \rotatebox{45}{$\blacksquare$}}}}

\begin{document}
\ttfamily
  \settowidth{\CodeWidthChar}{?}%
  \settoheight{\CodeHeightChar}{?}%
Here follows the "Replacement character": \ucr
\end{document}

现在我想用这个缩放定义的字符自动替换我的第一个示例中的“替换字符”,但我没有成功。我尝试使用 xelatex:

\DeclareUnicodeCharacter{�}{\ucr}

导致:

! Undefined control sequence.
l.10 \DeclareUnicodeCharacter
                             {�}{\ucr}

和:

\DeclareUnicodeCharacter{EFBFBD}{\ucr}

导致:

! Undefined control sequence.
l.10 \DeclareUnicodeCharacter
                             {EFBFBD}{\ucr}

代码:

\documentclass{book}

\usepackage[utf8]{inputenc}
\usepackage{adjustbox,amssymb,graphicx,stackengine,xcolor}
\newlength{\CodeWidthChar}
\newlength{\CodeHeightChar}
\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
   \textcolor{white}{\sffamily\bfseries\small ?}}{%
   \rotatebox{45}{$\blacksquare$}}}}
\DeclareUnicodeCharacter{EFBFBD}{\ucr}
\begin{document}
\ttfamily

%% 编辑:\settowidth{\CodeWidthChar}{?}% \settoheight{\CodeHeightChar}{?}% %% 结束编辑。以下是“替换字符”:� (EFBFBD)。 \end{document}

如何解决这个问题(在 xelatex 或 pdflatex 中)。

编辑:在最后的代码片段中添加设置宽度和高度。

答案1

使用 xelatex 您可以执行以下操作:

\documentclass{book}

\usepackage{adjustbox,amssymb,graphicx,stackengine,xcolor}
\newlength{\CodeWidthChar}
\newlength{\CodeHeightChar}
\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
   \textcolor{white}{\sffamily\bfseries\small ?}}{%
   \rotatebox{45}{$\blacksquare$}}}}
%\DeclareUnicodeCharacter{EFBFBD}{\ucr}
\catcode`\�=13
\def�{\ucr}
\begin{document}
\ttfamily
Here follows the "Replacement character": � (EFBFBD).
\end{document}

它不适用于 lualatex,它会抱怨无效的 utf8 字符。

使用 pdflatex 时,您必须声明FFFD字符(但您必须在 \ucr 定义中更正高度和宽度,使用 pdflatex 时它不会为我输出任何内容):

\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage{adjustbox,amssymb,graphicx,stackengine,xcolor}
\newlength{\CodeWidthChar}
\newlength{\CodeHeightChar}
\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
   \textcolor{white}{\sffamily\bfseries\small ?}}{%
   \rotatebox{45}{$\blacksquare$}}}}
\DeclareUnicodeCharacter{FFFD}{XXX}
\begin{document}
\ttfamily \ucr
Here follows the "Replacement character": � (EFBFBD).
\end{document}

答案2

根据@UlrikeFischer 提供的代码,适用于 pdflatex 和 xelatex。我将它们组合在一起,以便在两种情况下都能正常工作(并且还添加了缺少的高度和宽度设置):

\documentclass{book}

\usepackage[utf8]{inputenc}
\usepackage{adjustbox,amssymb,graphicx,stackengine,xcolor}
\newlength{\CodeWidthChar}
\newlength{\CodeHeightChar}
\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
   \textcolor{white}{\sffamily\bfseries\small ?}}{%
   \rotatebox{45}{$\blacksquare$}}}}
\usepackage{ifpdf}
\ifpdf
  \DeclareUnicodeCharacter{FFFD}{\ucr}
\else
  \catcode`\�=13
  \def�{\ucr}
\fi

\begin{document}
\ttfamily
\settowidth{\CodeWidthChar}{?}%
\settoheight{\CodeHeightChar}{?}%
Here follows the "Replacement character": � (EFBFBD).
\end{document}

相关内容