我正在使用 pdfLaTeX 编写一段德语文本,其中许多单词包含连字符(IR-Spektrum、Raman-Spektrum、UHV-Kammer、EPR-Spektroskopie 等)。为了允许在所有合理的断点处使用连字符,我必须使用连字符,而"=
不是-
(IR"=Spektrum
、Raman"=Spektrum
、UHV"=Kammer
等EPR"=Spektroskopie
)。考虑到我必须编写的连字符数量,这变得相当烦人,并且代码的(校对)可读性也下降了。
有没有办法在纯文本情况下(即数学之外)交换-
和的含义"=
,同时保持 -- as –(en-dash)和 --- as —(em-dash)?
答案1
(在收到 OP 和@UlrikeFischer 的评论后,答案进行了彻底修改。)
我认为您想允许在用连字符连接的复合词的左侧和右侧的“子词”中使用连字符。我进一步假设左侧子词可以以字母或数字结尾,而右侧子词必须以字母开头。这种带连字符的复合词的示例有EPR-Spektroskopie
、Baden-Württemberg
和T1-Schriften
。如果使用 LuaLaTeX 而不是 pdfLaTeX 是您的选项,那么设置一个 Lua 函数来即时执行-
到"=
和"=
到 的转换非常简单。-
正如你所要求的,"=
可以——事实上,它必须-- 用于必须被视为“普通”连字符的连字符实例,即一定不转换"=
为排版目的。例如,假设siunitx
包已加载,并且文档包含序列
\SI[per-mode=symbol, tight-spacing]{4e-3}{\meter\per\second}
注意,此序列包含三个 实例-
:在“per”和“mode”之间、在“tight”和“spacing”之间以及在 和 之间4e
。3
要使 LaTeX 将 的前两个实例视为-
普通连字符,您必须将此序列输入为
\SI[per"=mode=symbol,tight"=spacing]{4e-3}{\meter\per\second}
这是不是有必要将 中的第三个-
( 4e-3
) 替换为"=
。为什么不呢?因为该-
字符后面没有字母。因此,Lua 函数从4e-3
一开始就不会运行。
下面提供的代码还具有 LaTeX 宏(名为\ConvertDashOn
和),用于打开和关闭 Lua 函数。(默认状态为“打开”。)如果您的文档包含逐字材料和/或代码列表,那么能够关闭 Lua 函数非常有用(事实上至关重要)。对于此类材料,在排版输出中显示 而不是\ConvertDashOff
是不可取的,对吗?"=
-
如果您好奇 Lua 函数的工作原理:该函数使用gsub
(“全局替换”)函数和 Lua 的捕获机制执行多个全局替换。至关重要的是,该函数被分配给 LuaTeX 的process_input_buffer
回调,这意味着它完成了它的工作前TeX 开始正常处理。
附言:该babel
包定义"=
为\penalty\@M-\hskip\z@skip
。检查此定义表明它可以在数学模式下安全使用。因此,没有必要阻止数学模式材料发生的-
替换。"=
% !TEX TS-program = lualatex
\documentclass[ngerman]{article}
\usepackage{fontspec,unicode-math,babel,luacode}
\usepackage{siunitx} % for `\SI[...]{...}{...}` example
%%% Lua-side code
\begin{luacode}
function dash_to_breakable_dash ( s )
s = unicode.utf8.gsub ( s, '(%w)"=(%a)', '%1XYZYX%2' )
s = unicode.utf8.gsub ( s, '(%w)%-(%a)', '%1"=%2' )
s = unicode.utf8.gsub ( s, '(%w)XYZYX(%a)', '%1-%2' )
return s
end
\end{luacode}
%%% TeX-side code
\newcommand\ConvertDashOn{\directlua{
luatexbase.add_to_callback ( "process_input_buffer" ,
dash_to_breakable_dash , "dash_to_breakable_dash" )}}
\newcommand\ConvertDashOff{\directlua{
luatexbase.remove_from_callback ( "process_input_buffer" ,
"dash_to_breakable_dash" )}}
\AtBeginDocument{\ConvertDashOn}
%% Just for this example
\setlength\parindent{0pt}
\usepackage[textwidth=1pt]{geometry}
\begin{document}
\obeylines % also just for this example
\mbox{Lua function switched \emph{on}}
EPR-Spektroskopie Baden-Württemberg T1-Schriften
\mbox{$x-y-z$}
% Replace '-' with '"=' in 'per-mode' and 'tight-spacing',
% but not in '3.5e-6'
\SI[per"=mode=symbol,tight"=spacing]{4e-3}{\meter\per\second}
\bigskip
\mbox{Lua function switched \emph{off}}
\ConvertDashOff
\verb+Raman-Spektrum+
\mbox{$x-y-z$}
EPR-Spektroskopie Baden-Württemberg T1-Schriften
\SI[per-mode=symbol,tight-spacing]{4e-3}{\meter\per\second}
\end{document}