在我的自动生成的 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}