朋友们:),我希望包含连字符的复合词,例如“Baden-Württemberg”,也可以在组成词的所有位置使用连字符(此处为:“Ba-den”和“Würt-tem-berg”)。
我知道有人说这样可能看起来很难看,我也知道我可以写类似的东西Ba\-den-Würt\-tem\-berg
。但我提供的是供客户使用的软件包,很难让每个人都在数千页手稿上插入转义符或手动连字符说明。毕竟,形式和内容的分离是 LaTeX 的强大功能之一。
那么,有没有一个简单的开关可以禁用包含连字符的单词的连字保护?我只能访问文档的序言,所以我无法在文本中插入任何内容。
我正在使用 LuaLaTeX fontspec
,因此\hyphenchar
在这个帖子不起作用。我也没有办法\hyphenation{Ba-den=Würt-tem-berg}
像在这个帖子。我必须提供一个包裹一般的使用。
我不知道这个问题是否重复。
以下是可供尝试的 MWE:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}[HyphenChar="2010]
%\setmainfont{Linux Libertine O}[HyphenChar="2010] %does not work
\usepackage[english]{babel}
\usepackage{lipsum}
\begin{document}
\lipsum[1]
Test electromagnetic-endioscopy
electromagnetic-endioscopy
electromagnetic-endioscopy
electromagnetic-endioscopy
Test electromagnetic-endioscopy
electromagnetic-endioscopy
electromagnetic-endioscopy
electromagnetic-endioscopy
electromagnetic-endioscopy
electromagnetic-endioscopy
\end{document}
请注意,该HyphenChar="2010
作品仅适用于拉丁现代,它可以防止连字符在连字符。这使得它接近期望的结果,但如果可能的话,在连字符处进行连字符连接将是可取的。
答案1
(重写答案,使解决方案更像一个独立的包。)
好消息是您同时使用 LuaLaTeX 和babel
。:-)
以下建议的解决方案提供了三个文件
一个待命名的 .sty 文件
comphyph.sty
(“复合词全连字”的缩写...),用于加载包babel
、启用"=
各种语言的简写,并设置两个 TeX 宏来打开和关闭 Lua 代码一个名为 的 .lua 文件
comphyph.lua
,其中包含 Lua 代码。从 加载comphyph.sty
。演示如何使用代码的驱动程序文件。它加载
comphyph
包并运行各种练习。
重要提示:代码通过用 替换所有 实例来工作<letter>-<letter>
,<letter>"=<letter>
其中"=
是 babel 简写宏。代码会照顾不是verbatim
在、Verbatim
和环境中执行这些替换lstlisting
。如果将替换应用于\label
、\ref
(以及\eqref
、\vref
、\autoref
和\cref
)、\url
、\href
、\cite
和\bibliography
宏的参数,代码还会撤消替换。使用下面的 Lua 代码作为模板来创建更多异常。
文件comphyph.sty
:
%% comphyph.sty
\ProvidesPackage{comphyph}[2016/03/15]
%% Load the 'babel' package and enabling babel's '"'
%% shorthand for languages other than "ngerman".
%% Augment as needed.
\RequirePackage[ngerman]{babel}
\addto\extrasbritish{\languageshorthands{ngerman}%
\useshorthands*{"}}
\addto\extrasenglish{\languageshorthands{ngerman}%
\useshorthands*{"}}
\addto\extrasfrench{\languageshorthands{ngerman}%
\useshorthands*{"}}
%% Load the file that contains the Lua functions
\directlua{ dofile ( "comphyph.lua" ) }
%% Tex-side macros to enable/disable operation of
%% "comphyph_ok" Lua function
\newcommand\comphyphOn{%
\directlua{luatexbase.add_to_callback (
"process_input_buffer", comphyph_ok, "comphyph_ok" )}}
\newcommand\comphyphOff{%
\directlua{luatexbase.remove_from_callback (
"process_input_buffer" , "comphyph_ok" )}}
\AtBeginDocument{\comphyphOn} % set to "on" by default
文件comphyph.lua
:
-- comphyph.lua, 2016/03/16
-- Start by setting up a Boolean variable and
-- setting its default value to "false"
in_verbatim_or_listings = false
-- Do string substitution *except* if we're in a
-- verbatim, Verbatim, or lstlistings environment
function comphyph_ok ( buff )
if string.find ( buff , "\\begin{[vV]erbatim}" ) or
string.find ( buff , "\\begin{lstlisting}" ) then
in_verbatim_or_listings = true
return buff
elseif string.find ( buff , "\\end{[vV]erbatim}" ) or
string.find ( buff , "\\end{lstlisting}" )then
in_verbatim_or_listings = false
return buff
elseif in_verbatim_or_listings == false then
buff = string.gsub (buff, '(%a)%-(%a)', '%1"=%2')
buff = undo_quote_equal ( buff )
return buff
end
end
-- Auxilliary function to undo string substitutions
-- for text strings in arguments of macros such as
-- \label, \ref, \cite, \url, and \href
function undo_quote_equal ( s )
s = string.gsub ( s , "(\\label%*?)(%b{})",
function ( macro, arg )
arg = string.gsub ( arg , '"=', '-' )
return macro..arg
end)
s = string.gsub ( s , "(\\%a*ref%*?)(%b{})",
function ( macro, arg )
arg = string.gsub ( arg , '"=', '-' )
return macro..arg
end)
s = string.gsub ( s , "(\\.-cite.-)(%b{})",
function ( macro, arg )
arg = string.gsub ( arg , '"=', '-' )
return macro..arg
end)
s = string.gsub ( s , "(%w%}?%}?%)?%])(%b{})",
function ( macro, arg )
arg = string.gsub ( arg , '"=', '-' )
return macro..arg
end)
s = string.gsub ( s , "(\\.-bib.-)(%b{})",
function ( macro, arg )
arg = string.gsub ( arg , '"=', '-' )
return macro..arg
end)
s = string.gsub ( s , "(\\url%*?)(%b{})",
function ( macro, arg )
arg = string.gsub ( arg , '"=', '-' )
return macro..arg
end)
s = string.gsub ( s , "(\\href%*?)(%b{})(%b{})",
function ( macro, arga, argb )
arga = string.gsub ( arga , '"=', '-' )
argb = string.gsub ( argb , '"=', '-' )
return macro..arga..argb
end)
return s
end
说明 TeX 和 Lua 代码使用的“驱动程序”文件:
% !TEX TS-program = lualatex
%% Demo file for comphyph package
\documentclass{article}
% Create a dummy bib entry
\usepackage{filecontents}
\begin{filecontents}{my-bib.bib}
@misc{ x-y-z , author = "Author", title = "Title", year = 3001}
\end{filecontents}
%% Use either BibTeX/natbib or biber/biblatex
%\usepackage[round]{natbib}
%\bibliographystyle{plainnat}
\usepackage[backend=biber]{biblatex}
\addbibresource{my-bib.bib}
\usepackage{url,amsmath}
\usepackage{varioref}
\usepackage[colorlinks,allcolors=blue]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\usepackage[british,english,french,ngerman]{babel}
\usepackage{comphyph} %% load the 'comphyph' package
\setlength\parindent{0pt} % just for this demo file
\begin{document}
%% Verify that hyphenation of hyphenated words is on
\selectlanguage{english}
\parbox{1mm}{extra-terrestrial}
\smallskip
\selectlanguage{ngerman}
\parbox{1mm}{Baden-Württemberg}
\smallskip
\selectlanguage{french}
\parbox{1mm}{laissez-passer}
\bigskip
\selectlanguage{english}
%% Set up a few cross-references
Dummy equation:
\begin{equation} \label{eq-pyth}
1+1=2
\end{equation}
Various cross-references: \ref{eq-pyth}, \eqref{eq-pyth}, \vref{eq-pyth}, \autoref{eq-pyth}, \cref{eq-pyth}.
%% Finally, create a citation call-out and generate the bibliography
\bigskip
A citation call-out: \cite{x-y-z}
%\bibliography{my-bib} % if using BibTeX/natbib
\printbibliography
\end{document}
上述代码产生的输出截图:
答案2
使用德语快捷方式babel
:Baden"=Würtemberg
允许在所有可能的断点处使用连字符。
\documentclass{article}
\usepackage{fontspec}
\usepackage{microtype}
\usepackage[ngerman,english]{babel}% english is main language
\useshorthands{"}
\addto\extrasenglish{\languageshorthands{ngerman}}
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\begin{sloppypar}
Test electromagnetic"=endioscopy
electromagnetic"=endioscopy
electromagnetic"=endioscopy
electromagnetic"=endioscopy
Testtttt Test electromagnetic"=endioscopy
electromagnetic"=endioscopy
electromagnetic"=endioscopy
electromagnetic"=endioscopy
electromagnetic"=endioscopy
electromagnetic"=endioscopy
\end{sloppypar}
\end{document}