对已经包含连字符的复合词启用额外的连字符点吗?

对已经包含连字符的复合词启用额外的连字符点吗?

朋友们:),我希望包含连字符的复合词,例如“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

使用德语快捷方式babelBaden"=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}

在此处输入图片描述

相关内容