环境可以在编译期间替换其中的文本吗?

环境可以在编译期间替换其中的文本吗?

世界语使用的字母表主要是 ASCII,但也包括字母 ĉ、ĝ、ĥ、ĵ、ŝ 和 ŭ。同时,一些 ASCII 字母未被使用。当仅限于 ASCII 时,有一个拼写标准,即重音字母不带重音符号,然后在字母后写上“x”(世界语中通常不使用)。因此,要写“ĉ”,请使用“cx”。

有没有办法在 Latex 文档中设置一个环境,在编译期间自动将 cx、gx、sx 等实例转换为正确的重音字母?我知道您可以使用 \^ 和 \v 命令、\^{c}、\^{g}、\v{s} 等来实现相同的结果,但是当输入大量重音字母时,这样做相当麻烦。我也可以输入没有重音字母的整个文档,然后使用编辑器的搜索/替换功能进行转换,但这似乎是编译器可以做的事情,只要我知道正确的命令。

答案1

可以使用xparseenviron;文本被吸收并将字符串转换为重音形式然后传递。

\documentclass{article}

\usepackage{xparse,environ}

\ExplSyntaxOn
\NewDocumentCommand{\textesperanto}{m}
 {
  \lokathor_convert_esperanto:n { #1 }
 }
\NewEnviron{esperanto}
 {
  \lokathor_convert_esperanto:V \BODY
 }

\tl_new:N \l__lokathor_text_tl

\cs_new_protected:Nn \lokathor_convert_esperanto:n
 {
  \tl_set:Nn \l__lokathor_text_tl { #1 }
  \tl_replace_all:Nnn \l__lokathor_text_tl { CX } { \^C }
  \tl_replace_all:Nnn \l__lokathor_text_tl { Cx } { \^C }
  \tl_replace_all:Nnn \l__lokathor_text_tl { cx } { \^c }
  \tl_replace_all:Nnn \l__lokathor_text_tl { GX } { \^G }
  \tl_replace_all:Nnn \l__lokathor_text_tl { Gx } { \^G }
  \tl_replace_all:Nnn \l__lokathor_text_tl { gx } { \^g }
  \tl_replace_all:Nnn \l__lokathor_text_tl { HX } { \^H }
  \tl_replace_all:Nnn \l__lokathor_text_tl { Hx } { \^H }
  \tl_replace_all:Nnn \l__lokathor_text_tl { hx } { \^h }
  \tl_replace_all:Nnn \l__lokathor_text_tl { JX } { \^J }
  \tl_replace_all:Nnn \l__lokathor_text_tl { Jx } { \^J }
  \tl_replace_all:Nnn \l__lokathor_text_tl { jx } { \^{\j} }
  \tl_replace_all:Nnn \l__lokathor_text_tl { SX } { \^S }
  \tl_replace_all:Nnn \l__lokathor_text_tl { Sx } { \^S }
  \tl_replace_all:Nnn \l__lokathor_text_tl { sx } { \^s }
  \tl_replace_all:Nnn \l__lokathor_text_tl { UX } { \u{U} }
  \tl_replace_all:Nnn \l__lokathor_text_tl { Ux } { \u{U} }
  \tl_replace_all:Nnn \l__lokathor_text_tl { ux } { \u{u} }
  \l__lokathor_text_tl
 }
\cs_generate_variant:Nn \lokathor_convert_esperanto:n { V }
\ExplSyntaxOff

\begin{document}

\begin{esperanto}
Italio aux Italujo (itale: Por auxskulti bv alklaki cxi ligon ``Italia'' Italia ),
oficiale Itala Respubliko (itale: Repubblica Italiana), estas sxtato de 
Suda Euxropo.

Nomata ankaux per antonomazioj, kiel ``la Boto'' pro gxia formo simila al boto 
kaj ``bela lando'' (itale ``bel paese'') pro gxia klimato kaj pro gxia naturaj kaj 
artaj belajxoj, geografie Italio estas formata el tri partoj: unu kontinenta, 
limita de Alpoj kaj de konvencia linio kiu kunligas La Spezia kun Rimini, unu 
duoninsula, kiu estas formata de cetera Italio kaj unu insula, kiu entenas la 
du plejgrandajn insulojn de la Mediteraneo, Sardinio kaj Sicilio, kie en la 
insulo de Pantelleria estas la malplej longa distanco de Afriko, je distanco 
de preskaux 70 kilometroj. La teritoriaj limoj etendigxas entute en 1800 kilometroj, 
dum la marbordoj longas 7500 kilometrojn.
\end{esperanto}

\textesperanto{CXGXHXJXSXUX}

\textesperanto{CxGxHxJxSxUx}

\textesperanto{cxgxhxjxsxux}

\end{document}

在此处输入图片描述

文本来自维基百科


另一种方法是使用 XeLaTeX。准备一个esperanto.map包含以下内容的文件

; TECkit mapping for TeX input conventions <-> Unicode characters

LHSName "TeX-text"
RHSName "UNICODE"

pass(Unicode)

; ligatures from Knuth's original CMR fonts
U+002D U+002D           <>  U+2013  ; -- -> en dash
U+002D U+002D U+002D    <>  U+2014  ; --- -> em dash

U+0027          <>  U+2019  ; ' -> right single quote
U+0027 U+0027   <>  U+201D  ; '' -> right double quote
U+0022           >  U+201D  ; " -> right double quote

U+0060          <>  U+2018  ; ` -> left single quote
U+0060 U+0060   <>  U+201C  ; `` -> left double quote

U+0021 U+0060   <>  U+00A1  ; !` -> inverted exclam
U+003F U+0060   <>  U+00BF  ; ?` -> inverted question

; additions supported in T1 encoding
U+002C U+002C   <>  U+201E  ; ,, -> DOUBLE LOW-9 QUOTATION MARK
U+003C U+003C   <>  U+00AB  ; << -> LEFT POINTING GUILLEMET
U+003E U+003E   <>  U+00BB  ; >> -> RIGHT POINTING GUILLEMET

; additions for Esperanto
; cx
U+0043 U+0058   <>      U+0108 ; LATIN CAPITAL LETTER C WITH CIRCUMFLEX
U+0043 U+0078   <>      U+0108 ; LATIN CAPITAL LETTER C WITH CIRCUMFLEX
U+0063 U+0078   <>      U+0109 ; LATIN SMALL LETTER C WITH CIRCUMFLEX
; gx
U+0047 U+0058   <>      U+011C ; LATIN CAPITAL LETTER G WITH CIRCUMFLEX
U+0047 U+0078   <>      U+011C ; LATIN CAPITAL LETTER G WITH CIRCUMFLEX
U+0067 U+0078   <>      U+011D ; LATIN SMALL LETTER G WITH CIRCUMFLEX
; hx
U+0048 U+0058   <>      U+0124 ; LATIN CAPITAL LETTER H WITH CIRCUMFLEX
U+0048 U+0078   <>      U+0124 ; LATIN CAPITAL LETTER H WITH CIRCUMFLEX
U+0068 U+0078   <>      U+0125 ; LATIN SMALL LETTER H WITH CIRCUMFLEX
; jx
U+004A U+0058   <>      U+0134 ; LATIN CAPITAL LETTER J WITH CIRCUMFLEX
U+004A U+0078   <>      U+0134 ; LATIN CAPITAL LETTER J WITH CIRCUMFLEX
U+006A U+0078   <>      U+0135 ; LATIN SMALL LETTER J WITH CIRCUMFLEX
; sx
U+0053 U+0058   <>      U+015C ; LATIN CAPITAL LETTER S WITH CIRCUMFLEX
U+0053 U+0078   <>      U+015C ; LATIN CAPITAL LETTER S WITH CIRCUMFLEX
U+0073 U+0078   <>      U+015D ; LATIN SMALL LETTER S WITH CIRCUMFLEX
; ux
U+0055 U+0058   <>      U+016C ; LATIN CAPITAL LETTER U WITH BREVE
U+0055 U+0078   <>      U+016C ; LATIN CAPITAL LETTER U WITH BREVE
U+0075 U+0078   <>      U+016D ; LATIN SMALL LETTER U WITH BREVE

第一部分是标准tex-text.map

使用以下方法编译文件

teckit_compile esperanto.map

现在用 XeLaTeX 进行编译测试。

\documentclass{article}

\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{esperanto}
\newfontfamily{\esperantofont}{Linux Libertine O}[Mapping=esperanto]

\begin{document}

Italio aux Italujo (itale: Por auxskulti bv alklaki cxi ligon ``Italia'' Italia ),
oficiale Itala Respubliko (itale: Repubblica Italiana), estas sxtato de 
Suda Euxropo.

Nomata ankaux per antonomazioj, kiel ``la Boto'' pro gxia formo simila al boto 
kaj ``bela lando'' (itale ``bel paese'') pro gxia klimato kaj pro gxia naturaj kaj 
artaj belajxoj, geografie Italio estas formata el tri partoj: unu kontinenta, 
limita de Alpoj kaj de konvencia linio kiu kunligas La Spezia kun Rimini, unu 
duoninsula, kiu estas formata de cetera Italio kaj unu insula, kiu entenas la 
du plejgrandajn insulojn de la Mediteraneo, Sardinio kaj Sicilio, kie en la 
insulo de Pantelleria estas la malplej longa distanco de Afriko, je distanco 
de preskaux 70 kilometroj. La teritoriaj limoj etendigxas entute en 1800 kilometroj, 
dum la marbordoj longas 7500 kilometrojn.

CXGXHXJXSXUX

CxGxHxJxSxUx

cxgxhxjxsxux

\end{document}

在此处输入图片描述

当然这种情况下直接Unicode输入也是可以的。

相关内容