切换连字命令的含义

切换连字命令的含义

我正在使用 pdfLaTeX 编写一段德语文本,其中许多单词包含连字符(IR-Spektrum、Raman-Spektrum、UHV-Kammer、EPR-Spektroskopie 等)。为了允许在所有合理的断点处使用连字符,我必须使用连字符,而"=不是-IR"=SpektrumRaman"=SpektrumUHV"=KammerEPR"=Spektroskopie)。考虑到我必须编写的连字符数量,这变得相当烦人,并且代码的(校对)可读性也下降了。

有没有办法在纯文本情况下(即数学之外)交换-和的含义"=,同时保持 -- as –(en-dash)和 --- as —(em-dash)?

答案1

(在收到 OP 和@UlrikeFischer 的评论后,答案进行了彻底修改。)

我认为您想允许在用连字符连接的复合词的左侧和右侧的“子词”中使用连字符。我进一步假设左侧子词可以以字母或数字结尾,而右侧子词必须以字母开头。这种带连字符的复合词的示例有EPR-SpektroskopieBaden-WürttembergT1-Schriften。如果使用 LuaLaTeX 而不是 pdfLaTeX 是您的选项,那么设置一个 Lua 函数来即时执行-"="=到 的转换非常简单。-

正如你所要求的,"=可以——事实上,它必须-- 用于必须被视为“普通”连字符的连字符实例,即一定不转换"=为排版目的。例如,假设siunitx包已加载,并且文档包含序列

\SI[per-mode=symbol, tight-spacing]{4e-3}{\meter\per\second}

注意,此序列包含三个 实例-:在“per”和“mode”之间、在“tight”和“spacing”之间以及在 和 之间4e3要使 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}

相关内容