新命令中的 UTF-8(但不在当前字体中)字符

新命令中的 UTF-8(但不在当前字体中)字符

我正在尝试定义一个新的单字符 LaTeX 命令(使用 \kern1pt 插入 1 pt 空格),并希望使用通过美国国际键盘布局上的 AltGr 键获得的字符之一。我选择了 Unicode U+00A6 '¦',又名“Broken Bar”字符。这是我的序言

\documentclass[11pt,english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{babel}

这是我的新命令定义

\expandafter\newcommand\csname u8:\detokenize{¦}\endcsname{\kern1pt}

我得到的错误是:

! LaTeX Error: Command \u8:¦ already defined.
.              Or name \end... illegal, see p.192 of the manual.

因此,为了了解发生了什么,我将“¦”替换为“∙”,Unicode U+2219“项目符号运算符”字符。我首先确保 LaTeX 在插入普通文本时对“∙”的抱怨与对“¦”的抱怨一样大(确实如此),然后将我的新命令定义更改为:

\expandafter\newcommand\csname u8:\detokenize{∙}\endcsname{\kern1pt}

这次我没有遇到任何错误,所以我继续使用我的新宏

a\∙b

并收到此错误:

! Undefined control sequence.
l.530 a\Ô
.        êÖb

为了解决这个问题,我在序言中加入了这句话,

\DeclareUnicodeCharacter{2219}{\textsurd}    % Recognise `∙' character in input

却得到了这个错误:

! LaTeX Error: Command \u8:ÔêÖ already defined.
.              Or name \end... illegal, see p.192 of the manual.

有人可以帮我节省几个小时浏览 newunicodechar 包手册吗?(我提醒一下,我需要使用'¦',而不是'∙'。)

答案1

存在以下几个问题:

  1. 已经为 定义了一个操作¦,确切地说\IeC{\textbrokenbar},这是预期的;因此\newcommand会给您错误。

  2. 如果你

    \expandafter\newcommand\csname u8:\detokenize{∙}\endcsname{\kern1pt}
    

    您不是在定义宏\∙,而是在定义 Unicode 字符的含义。由于在 UTF-8 中由三元组表示E2 88 99,因此 TeX 会看到\^^e2错误消息,并且错误消息使用了三个字节的某种表示形式。

newunicodechar不需要做任何特别的事情:

% -*- coding: utf-8 -*-
\documentclass[11pt,english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{babel}
\usepackage{newunicodechar}
\newunicodechar{¦}{\kern20pt} % exaggerated to show the effect
\begin{document}
A¦A
\end{document}

输出为

在此处输入图片描述

日志文件将报告

Package newunicodechar Warning: Redefining Unicode character on input line 11.

这将是

Package newunicodechar Warning: Redefining Unicode character; it meant
(newunicodechar)                ***  \IeC {\textbrokenbar }  ***
(newunicodechar)                before your redefinition on input line 11.

如果verbose使用该选项(\usepackage[verbose]{newunicodechar})。

这是文档中的相关部分newunicodechar

该包仅提供一个命令,\newunicodechar必须使用两个参数来调用该命令:

\newunicodechar{<char>}{<code>}

其中<char>,是我们需要赋予含义的 Unicode 字符, <code>是该含义,即将替换为字符的 LaTeX 代码。

答案2

如果您想要的只是问题的解决方案:

\expandafter\renewcommand\csname u8:\detokenize{¦}\endcsname{\kern1pt}

现在做一些解释。

在 tex 中处理 utf-8 比较棘手。对于 TeX,一个字节代表一个字符,而在 utf8 中,某些字符需要更多字节(请参阅我的回答使用 \usepackage[utf8]{inputenc} 对 unicode 字符进行 Catcodes更多细节)

在您的例子中,unicode 字符¦在 utf8 中被编码为两个字节(十六进制值)的序列C2 A6,但对于 TeX 来说,它们是两个单独的字符。这些字节顺便编码了字形┬ª旧 Windows 终端使用的代码页latin-1,它解释了您在 Linux 终端中使用时会看到的部分错误消息¦)。

使用\csname u8:\detokenize{¦}\endcsname您正在编写的 TeX 宏名称,否则将无法类型化\u8:┬ªinputenc还会使用其他技巧来使一些字节成为“活动字符”(C2其中的字节),以便当在输入中找到它们时,它们会触发一些inputenc内部宏。

在此特定情况下,当输入包含序列(如 tex 所示)时C2 A6,inputenc 管理调用宏的事情\u8:┬ª 不幸的是,textcomp包已经定义了该宏来排版断条(预期结果),因此您定义它的尝试会失败。我的解决方案使用\renewcommand按预期工作。

您第二次尝试使用·成功了,显然该序列未定义。字符·以 utf8 编码为序列C2 B7┬À在您的终端中)。但是,当您尝试通过写入 来使用它时,TeX 看到的是\┬À和该宏没有定义。您定义的宏是\u8:┬À。要调用此宏,您只需·在源代码中写入,而不是

但是,出于我无法理解的原因,当我输入 时A·B,虽然编译时没有错误,但我得到的是A·BPDF 中的 ,而不是所需的字距。这种情况只发生在·char 上。我尝试过的其他“罕见”字符,例如 ,都§可以完美运行。

答案3

无需使用内部 csname 形式:

\documentclass[11pt,english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{babel}

\DeclareUnicodeCharacter{00A6}{((\kern1pt))}
\begin{document}

a [¦] b

\end{document}

生产

在此处输入图片描述

只是(())为了让事物可见

答案4

我无法重现您的问题\DeclareUnicodeCharacter。它对我来说很好

\documentclass[11pt,english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{babel}
\DeclareUnicodeCharacter{00A6}{hallo}
\DeclareUnicodeCharacter{2219}{World}
\begin{document}
¦ ∙
\end{document}

相关内容