pdfLaTeX:将 € (欧元符号)转换为命令

pdfLaTeX:将 € (欧元符号)转换为命令

€{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

\€也可以接受

然后,一个简单的方法:

\documentclass{article}
\usepackage{eurosym,siunitx}
\def\€#1{\SI{#1}{\mbox{\euro}}}
\begin{document}
\€{9x10,00}
\end{document}

姆韦

答案4

如果你使用 pdftex (或 tex)那么标记不止一个。第一个字符必须是 catcode 13(活动)才能触发对以下两个字符的 UTF-8 解释,因此不可能定义\€为 TeX 命令名称只能是单个字符,除非名称中的所有字符都是 catcode 11(字母)。

如果您使用 xetex 或 luatex,那么 € 就是单个令牌并且可以被激活,或者您可以定义\€

也就是说,您可以通过将 € 的 inputenc 定义定义为使用 siunitx 的命令来执行您想要的操作。

相关内容