![如何修改自定义环境中的单个(范围)字符?](https://linux22.com/image/383993/%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83%E4%B8%AD%E7%9A%84%E5%8D%95%E4%B8%AA%EF%BC%88%E8%8C%83%E5%9B%B4%EF%BC%89%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
我是一名历史语言学家,研究赫梯语和卢维语文本,这些文本以楔形文字流传至今。在文章等中引用这些语言的单词时,我们通常不使用楔形文字符号本身,而是使用罗马文字的音译,用连字符分隔每个字符,例如阿穆尤克'我'。
在音译中,所有小写字母 (az) 通常都用斜体表示,而大写字母和非字母字符 (数字、括号、连字符、斜线) 则保持直立。此外,所有s和年代吃点哈切克,H和H下方有一个短音符。目前,我使用单独的命令(在 XeLaTeX 中)分别标记这些变音符号/格式,分别使用自定义命令\hacek{}
和添加 haceks 和短音符\invsubarch{}
。因此,我写下\textsuperscript{DUG}\textit{\invsubarch{h}a}-\textit{ne}-\textit{e\hacek{s}}-\textit{n}[\textit{a}-\textit{a\hacek{s}}]
创建(根据需要):
我想创建一个新环境\hitt{}
,其中所有字符 az 都自动变为斜体,并且每个s/年代和H/H分别自动替换为/hacek{s}
和/invsubarch{h}
。理想情况下,我可以将上一段中的单词输入为\hitt{\textsuperscript{DUG}ha-ne-es-n[a-as]}
。
任何帮助定义这个新环境的帮助都将不胜感激!如果需要更多信息,请告诉我。
(如果这个问题与另一个问题重复,我深表歉意。我搜索过 Google、StackExchange 和 StackOverflow,但无法找到 - 据我判断 - 与我的情况相当的情况。)
答案1
您可以进行正则表达式搜索和替换。具体来说,s
和S
被更改为字符后跟 U+030C(组合卡罗),XeTeX 会将其分别规范化为和š
;Š
对于h
和,也是同样H
,其后跟 U+032E(组合下面的短音符),并被规范化为ḫ
和Ḫ
。
|...|
我借此机会建议\textsuperscript{...}
添加替代品来代替。
\documentclass{article}
\usepackage{fontspec}
\usepackage{xparse}
\setmainfont{Libertinus Serif}
\ExplSyntaxOn
\NewDocumentCommand{\hitt}{m}
{
\tl_set:Nn \l_xander_hitt_tl { #1 }
% change every run of lowercase letters into italic
\regex_replace_all:nnN
{ [a-z]+ }
{ \c{textit}\cB\{\0\cE\} }
\l_xander_hitt_tl
% change every h/H into h/H U+032E
\regex_replace_all:nnN
{ [hH] }
{ \0 \x{032e} }
\l_xander_hitt_tl
% change every s/S into s/S U+032E
\regex_replace_all:nnN
{ [sS] }
{ \0 \x{030c} }
\l_xander_hitt_tl
% change |...| into \textsuperscript{...}
\regex_replace_all:nnN
{ \|([^|]+)\| }
{ \c{textsuperscript}\cB\{\1\cE\} }
\l_xander_hitt_tl
% print the result
\tl_use:N \l_xander_hitt_tl
}
\ExplSyntaxOff
\begin{document}
\hitt{|DUG|ha-ne-es-n[a-as]}
\end{document}
笔记
[a-z]+
代表一个或多个小写字母的连续\c{textit}
表示“控制序列\textit
”\cB\{
并\cE\}
代表小组制作 TeX 括号\x{<hex digits>}
代表相应代码的字符\0
在替换字符串中表示匹配;\1
是第一个捕获组\|([^|]*)\|
搜索|
(必须在搜索字符串中进行转义),然后搜索任何不同于|
直到找到匹配的标记|
答案2
各种可能性不断涌现。
这不是一个答案,而是一个延伸的潜力:赫梯文本的红字化(还有古波斯语、乌加里特语等等)。
使用具有“纯”文本输入方法的映射文件,以便 egreg 的环境处理“s”和“h”,并且另外双元音变成单字母尖音,然后使用 xelatex 进行编译:
梅威瑟:
\documentclass[12pt]{article}
\usepackage{fontspec}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{stackengine}
\setmainfont{Linux Libertine}
\newfontface\hitt{Noto Sans Cuneiform}
\newfontface\fmhitt[Mapping=latin-to-hittite2,Colour=blue]{Noto Sans Cuneiform}
\DeclareTextFontCommand{\texthitt}{\Large\fmhitt}
\newenvironment{thitt}
{\fmhitt\Large\ignorespaces}
{\ignorespacesafterend}
\ExplSyntaxOn
\NewDocumentCommand{\ehitt}{m}
{
\tl_set:Nn \l_xander_hitt_tl { #1 }
% change every run of lowercase letters into italic
\regex_replace_all:nnN
{ [a-z]+ }
{ \c{textit}\cB\{\0\cE\} }
\l_xander_hitt_tl
% change every h/H into h/H U+032E
\regex_replace_all:nnN
{ [hH] }
{ \0 \x{032e} }
\l_xander_hitt_tl
% change every s/S into s/S U+032E
\regex_replace_all:nnN
{ [sS] }
{ \0 \x{030c} }
\l_xander_hitt_tl
% change every double vowel aa/ into a/ U+0301
\regex_replace_all:nnN
{ ([a,e,i,u]){2,2} }
{ \1 \x{0301} }
\l_xander_hitt_tl
% change |...| into \textsuperscript{...}
\regex_replace_all:nnN
{ \|([^|]+)\| }
{ \c{textsuperscript}\cB\{\c{textsc}\cB\{\1\cE\}\cE\}
}
\l_xander_hitt_tl
% print the result
\tl_use:N \l_xander_hitt_tl
}
\ExplSyntaxOff
\newcommand\hstackon[2]{\stackon{\begin{thitt}#1\end{thitt}}{\ehitt{#2}}}
\begin{document}
\section{Hittite}
\hstackon{|dug|}{|dug|}
\hstackon{ha}{ha}
\hstackon{ne}{ne}
\hstackon{es}{es}
\hstackon{na}{na}
\hstackon{as}{as}
Random text from the UChicago \textit{Hittite Dictionary}, volume \textbf{P}, p 144, sv \ehitt{parh-} (chase): "and may the oath deities pursue you continuously"
\begin{center}
\hstackon{niis}{|niis|}
\hstackon{dingir}{|dingir|}
\hstackon{mes}{|mes|}
\hstackon{paar}{paar}
\hstackon{he}{he}
\hstackon{es}{es}
\hstackon{kaan}{kaan}
\hstackon{du}{du}
\end{center}
\begin{center}
\hstackon{|niis.dingir.mes|paar-he-es-kaan-du}{|niis.dingir.mes|paar-he-es-kaan-du}
\end{center}
Mapping file (based on Wikipedia article) is incomplete, having the syllables (V, VC, VC, CVC) and a few determiners. Glyph for \textsc{\ehitt{niis}} needs to be tracked down; keyed in as \texttt{niis}, it is obviously incorrect as it is being parsed as the two syllables \texttt{ni} + \texttt{is}: \hstackon{ni}{ni}\hstackon{is}{is} by the font map.
Otherwise, some general formatting required (e.g., struts or similar to line up the ruby text).
\end{document}
映射文件,使用 teckit_compile.exe 进行编译:
; TECkit mapping for TeX input conventions <-> Unicode characters
LHSName "latin-to-hittite"
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
;U+0020 > U+0020 ; space maps to space
U+002D > U+200D ; hyphen as Zero Width Joiner
U+002E > U+200D ; dot as Zero Width Joiner
U+007C > U+200C ; pipe as Zero Width Non-Joiner
U+0061 <> U+12000 ; a