€{9x10,00}
我希望以(或€[]
) 产生 的方式使用 € (\€ 也可以接受) \SI{9x10,00}{€}
(因此是将 € 转换为命令的特殊情况)。最好是,如果单独输入 ( €
),它应该产生\si{€}
,但这可能是额外的细节。
€ 符号在我的某些文档中出现了很多次,\SI{#1}{€}
对于没有太多乳胶/编程经验并且习惯于使用 word 的人来说(不是我),打字会变得很烦人,因此我设计了这样一个简单的最终命令。
我试过了:
\catcode`€=11 %also \catcode8364=11 which is 0x20AC, unicode for €
\newcommand{\€}[1]{\SI{#1}{€}}
但我在 catcode 上收到错误,因为 € 是 utf-8。此外,我还被要求输入€{}
,然后€
会出现错误。这接近我想要的,但它依赖于 catcode。
答案1
对于 XeTeX 或 LuaTeX 等 Unicode TeX 引擎来说这很简单:
\catcode€=\active
\newcommand*€[1]{\SI{...}{...}}
这同样适用于具有 8 位输入编码的其他 TeX 引擎(例如latin9
)。
但是使用 UTF-8 字节作为输入会比较棘手,因为欧元符号由三个 UTF-8 字节组成。三个字节不能是一个活动字节,而且类别代码通常不是“字母”(11),而是“其他”(12)。因此这些 UTF-8 字节不能在命令名称内使用。
下面的示例使用 LaTeX 的inputenc
机制将 UTF-8 字节序列分配给宏:
如果宏后面紧跟着左花括号(中间没有空格),那么宏将数字作为参数并将其传递给
\SI
。如果宏后面紧跟着左方括号,那么可选参数和数字一起传递给
\SI
。否则,无需使用参数即可打印正常的欧元符号。
\SI{9}{€}
作品。\section
€对于目录来说很强大。对于
hyperref
的书签,\texteuro
可以使用 或通过 提供书签的替代方案\texorpdfstring
。可以通过以下方式启用不带参数的欧元符号:\pdfstringdefDisableCommands{\let\EuroMacro\texteuro}
完整示例:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{lmodern}
\usepackage{ltxcmds}
\usepackage{siunitx}
\sisetup{output-decimal-marker={,}}
\DeclareSIUnit{\euro}{\texteuro}
\newcommand*{\sieuro}[2][]{\SI[{mode=text,#1}]{#2}{\euro}}
\makeatletter
\newcommand*{\EuroMacro}{}
\protected\def\EuroMacro{%
\ltx@ifnextchar@nospace\bgroup\sieuro{%
\ltx@ifnextchar[\sieuro\texteuro
}%
}
\newunicodechar{€}{\EuroMacro}
\makeatother
\begin{document}
€{12,34} and the currency is €.
€[add-integer-zero]{.42}
\sisetup{mode=text}
\SI{9}{€}
\end{document}
TeX 文件中软件包数量最少的版本。作为变体,欧元符号由软件包生成eurosym
:
\documentclass{article}
\usepackage[utf8]{inputenc}% UTF-8 input for non-Unicode TeX engines
\usepackage{eurosym}% euro sign
\usepackage{siunitx}
\sisetup{output-decimal-marker={,}}
\DeclareSIUnit{\Euro}{\euro}
\newcommand*{\sieuro}[2][]{\SI[{mode=text,#1}]{#2}{\Euro}}
\makeatletter
\newcommand*{\EuroMacro}{%
\ifx\@let@token\bgroup
\expandafter\sieuro
\else
\ifx\@let@token[%
\expandafter\expandafter\expandafter\sieuro
\else
\expandafter\expandafter\expandafter\euro
\fi
\fi
}
\protected\def\EuroMacroAux{%
\futurelet\@let@token\EuroMacro
}
\AtBeginDocument{%
\DeclareUnicodeCharacter{20AC}{\EuroMacroAux}%
}
\makeatother
\begin{document}
€{12,34} and the currency is €.
€[add-integer-zero]{.42}
\sisetup{mode=text}
\SI{9}{€}
\end{document}
答案2
无法设置€
中的类别代码pdflatex
,因为它的长度为三个字节。但是,还有其他方法。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage[right]{eurosym} % I can't stand textcomp euro symbol
\usepackage{newunicodechar}
\makeatletter
\newunicodechar{€}{\olivetree@euro}
\newcommand{\olivetree@euro}{\@ifnextchar\bgroup\EUR{\euro}}
\makeatother
\begin{document}
You owe me €{100.23}; please, pay in €.
\end{document}
如果您想使用siunitx
打印数字的功能,
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage[right]{eurosym} % I can't stand textcomp euro symbol
\usepackage{newunicodechar}
\usepackage{siunitx}
\makeatletter
\newunicodechar{€}{\olivetree@euro}
\newcommand{\olivetree@euro}{\@ifnextchar\bgroup\olivetree@euro@arg\euro}
\newcommand{\olivetree@euro@arg}[1]{\num{#1}\,\euro}
\makeatother
\begin{document}
You owe me €{100.23}; please, pay in €.
\end{document}
XeLaTeX 或 LuaLaTeX 需要进行一些更改:
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\usepackage{siunitx}
\makeatletter
\newcommand{\olivetree@euro}{\@ifnextchar\bgroup\olivetree@euro@arg{€}}
\newcommand{\olivetree@euro@arg}[1]{\num{#1}\,€}
\newunicodechar{€}{\olivetree@euro}
\makeatother
\begin{document}
You owe me €{100.23}; please, pay in €.
\end{document}
答案3
答案4
如果你使用 pdftex (或 tex)€
那么三标记不止一个。第一个字符必须是 catcode 13(活动)才能触发对以下两个字符的 UTF-8 解释,因此不可能定义\€
为 TeX 命令名称只能是单个字符,除非名称中的所有字符都是 catcode 11(字母)。
如果您使用 xetex 或 luatex,那么 € 就是单个令牌并且可以被激活,或者您可以定义\€
。
也就是说,您可以通过将 € 的 inputenc 定义定义为使用 siunitx 的命令来执行您想要的操作。