在我的论文中,我将包含相当多的标签(形态标签,如果重要的话),这些标签是固定宽度的字符串,如下所示:ab-c--d
,其中破折号表示 NULL 字段。我想定义一个宏\msd
,它接受这样的标签,并使用短破折号输出 NULL 字段。
据我所知,这个宏需要做两件事:
- 禁用双连字符和三连字符连字(以避免两个 NULL 字段相邻时出现异常)
- 将连字符渲染为短划线所需的实际技术技巧
不幸的是,我不知道该如何做。有人能帮我解决这个问题吗,或者给我指明正确的方向?
答案1
这是一个简单的乳胶解决方案。但是,如果您向其输入意外的内容,例如括号分隔的材料(例如,\msd{ab{-b-c}d}
),则可能会出现奇怪的行为。
\documentclass{minimal}
\newcommand{\msd}[1]{\msdhelper#1\relax}
\newcommand{\msdhelper}[1]
{\ifx\relax#1\else
\ifx-#1--{}\else#1\fi
\expandafter\msdhelper\fi}
\begin{document}
\msd{ab-c--d}
\end{document}
答案2
您的问题有一个简单的解决方案:只需将您的源文件编码为 UTF-8,然后将所有空字段标记更改为源中的实际 en 破折号。
但是,我认为这不会实现您真正想要的格式,因为当您将两个破折号放在一起时,它们之间不会有任何空格(与连字符不同)。所以您可能需要更复杂一些,因为您需要在每个破折号后添加一些空格以将空字段显示为单独的元素。
因此,这是使用 XeLaTeX 的另一种解决方案:创建一个自定义映射文件,将连字符映射到带有不间断空格的短划线。以下说明适用于 Mac 或 Linux 机器;同样的事情可以在 Windows 上完成,但我不知道如何做,尽管您可以在下面的链接中获得说明。
首先,TECkit
从下载并安装软件南澳大利亚州:
接下来,创建以下映射文件(纯文本文件,名为 hyphen-dash.map)。此文件将 '-' 映射到 en-dash+non-breaking space。
; Hyphen to emdash mapping file for XeTeX
; hyphen-dash.map
;
LHSName "hyphen-dash"
RHSName "UNICODE"
pass(Unicode)
U+002D <> U+2013 U+00A0 ; "-" -> "– "
接下来,使用命令行中的以下命令编译此文件:
teckit_compile hyphen-dash.map -o hyphen-dash.tec
将文件复制hyphen-dash.tec
到本地 texmf 文件夹fonts/misc/xetex
现在可以编译以下xelatex文档:
% !TEX TS-program = XeLaTeX
\documentclass{article}
\usepackage{fontspec}
\pagestyle{empty}
\setmainfont[Mapping=tex-text]{Charis SIL}
\newfontfamily\glossfont[Mapping=hyphen-dash]{Charis SIL}
\newcommand{\formatgloss}[1]{{\glossfont#1}}
\begin{document}
Without the hyphen mapping: regular hyphens and dashes:
a-b--c---d
What happens when you put two en-dashes directly together:
a––
Now with the mapping file enabled:
\formatgloss{a-b--c----d}
This solution can be used inside other macros:
\textit{\formatgloss{a-b--c----d}}
\end{document}
这里输出:
答案3
以下 TeXnical jiggery-pokery 似乎有效:
\documentclass{article}
\begingroup
\catcode`-=\active
\aftergroup\newcommand
\aftergroup-
\endgroup
{--\relax}
\newcommand\msd{\begingroup\catcode`-=\active\msdhelper}
\newcommand\msdhelper[1]{#1\endgroup}
\begin{document}
test \msd{ab-c--d} test-case
\end{document}
在\msd
宏中,-
被激活(并产生 en-dash),但-
之后恢复正常。如果其他软件包尝试使用类似的技巧来-
激活,此解决方案可能会带来麻烦。
答案4
还有一个 LaTeX3 答案:我们使用 逐个标记遍历参数,并用标记列表\tl_map_function:nN
替换每个字符。请注意,此实现会因括号中的内容而混淆,例如将失败。-
--\relax
\msd{a{bc}d}
\documentclass{minimal}
\usepackage{expl3}
\usepackage{xparse}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn \msd #1 {
\tl_map_function:nN {#1} \msd_convert_dash:n
}
\cs_new:Npn \msd_convert_dash:n #1 {
\token_if_eq_charcode:NNTF - #1 {\texttt{-}} {#1}
}
\ExplSyntaxOff
% Tests
\msd{a--b-c}
\msd{a-bc}
% It is expandable:
\edef\foo{\msd{a-b---c}}
\foo
\end{document}
编辑:Alan Munn 说得对,两个破折号放在一起看起来不好看。我\texttt{-}
在我的解决方案中用 替换了它。