我正在尝试定义一个新的单字符 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
存在以下几个问题:
已经为 定义了一个操作
¦
,确切地说\IeC{\textbrokenbar}
,这是预期的;因此\newcommand
会给您错误。如果你
\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·B
PDF 中的 ,而不是所需的字距。这种情况只发生在·
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}