强制 LaTeX 使用连字符断开无意义的行

强制 LaTeX 使用连字符断开无意义的行

我有一篇长文,其中包含许多国际音标 (IPA) 字符序列,显然它们不能组成任何有意义的英文单词。

我想在我的论文中插入这段长文,但由于它们不包含有意义的单词,因此 IPA 序列不会用连字符换行。

最小代码(XeLaTex):

\documentclass{article}
\usepackage{fontspec}
\setmainfont{XITS}

\begin{document}

∅ p b f v m t d s z n c ɟ ʃ ʒ ɲ k ɡ x h l r r̝ j [pbfvmtdszncɟʃʒɲkɡxhlrr̝j][pbtdɡfvszʃʒxjrr̝lmnɲ] [tdkvszxhjrr̝lpbɡfʃʒxmnɲ][pbtdkfvszʃʒxhr̝mnɲ][pbtdcɟkvsʃʒxhmnɲjr̝rl] [thlpbtdfvszʃʒmnɲ][tkszxhr̝dʃʒ][pbtdkvsʃxhmnɲ][vmnɲjr̝rl] [fvsz][tdsz]kvj

\end{document}

结果: 未使用连字符

我如何才能强制 LaTeX 用连字符在任意位置中断长字符串?我无法手动换行,因为就像我说的,有很多这样的序列,所以我无法手动逐一检查。

答案1

在此处输入图片描述

不清楚是否要在休息处使用连字符,我在-这里显示了没有和有,同样不清楚一些之间的空格是否] [有意义,我[...]在这里什么也不做所以] [允许休息(如果没有发生休息则显示空格)并且][不显示空格并且不允许休息。

\documentclass{article}
\usepackage{fontspec}
\setmainfont{XITS}
\def\x#1{#1\linebreak[0]\x}
\def\xstop#1\x{}
\begin{document}

∅ p b f v m t d s z n c ɟ ʃ ʒ ɲ k ɡ x h l r r̝ j [\x pbfvmtdszncɟʃʒɲkɡxhlrr̝j\xstop][\x pbtdɡfvszʃʒxjrr̝lmnɲ\xstop] [\x tdkvszxhjrr̝lpbɡfʃʒxmnɲ\xstop][\x pbtdkfvszʃʒxhr̝mnɲ\xstop][\x pbtdcɟkvsʃʒxhmnɲjr̝rl\xstop] [\x thlpbtdfvszʃʒmnɲ\xstop][\x tkszxhr̝dʃʒ\xstop][\x pbtdkvsʃxhmnɲ\xstop][\x vmnɲjr̝rl\xstop] [\x fvsz\xstop][\x tdsz\xstop]kvj


\def\x#1{#1\-\x}

∅ p b f v m t d s z n c ɟ ʃ ʒ ɲ k ɡ x h l r r̝ j [\x pbfvmtdszncɟʃʒɲkɡxhlrr̝j\xstop][\x pbtdɡfvszʃʒxjrr̝lmnɲ\xstop] [\x tdkvszxhjrr̝lpbɡfʃʒxmnɲ\xstop][\x pbtdkfvszʃʒxhr̝mnɲ\xstop][\x pbtdcɟkvsʃʒxhmnɲjr̝rl\xstop] [\x thlpbtdfvszʃʒmnɲ\xstop][\x tkszxhr̝dʃʒ\xstop][\x pbtdkvsʃxhmnɲ\xstop][\x vmnɲjr̝rl\xstop] [\x fvsz\xstop][\x tdsz\xstop]kvj

\end{document}

答案2

这会\-在所有字符之间添加,但要注意不要太早添加(不考虑三个前导字符和三个尾随字符)并且不要篡改组合字符(从 U+0301 到 U+036F)。

您可能想要一个比 更好的名字\foo

\documentclass[twocolumn]{article}
\usepackage{fontspec}
\setmainfont{XITS}

\ExplSyntaxOn
\NewDocumentCommand{\foo}{m}
 {
  [
  % split the input at its items (characters)
  \seq_set_split:Nnn \l_tmpa_seq { } { #1 }
  % map the input, considering also the index of each item
  % ##1 is the index, ##2 is the item
  \seq_map_indexed_inline:Nn \l_tmpa_seq
   {
    % check that the character is not a combining one
    % and that we're have at least three characters
    % before and after
    \bool_lazy_and:nnT
     {
      ! \int_compare_p:n { "0301 <= `##2 <= "036F } % not a combining
     }
     {
      \int_compare_p:n { 3 < ##1 < \seq_count:N \l_tmpa_seq - 1 } % we're in the middle
     }
     { \- } % add a discretionary
    % print the character
    ##2
   }
  ]
 }
\ExplSyntaxOff

\begin{document}

∅ p b f v m t d s z n c ɟ ʃ ʒ ɲ k ɡ x h l r r̝ j 
\foo{pbfvmtdszncɟʃʒɲkɡxhlrr̝j}\foo{pbtdɡfvszʃʒxjrr̝lmnɲ} 
\foo{tdkvszxhjrr̝lpbɡfʃʒxmnɲ}\foo{pbtdkfvszʃʒxhr̝mnɲ}\foo{pbtdcɟkvsʃʒxhmnɲjr̝rl} 
\foo{thlpbtdfvszʃʒmnɲ}\foo{tkszxhr̝dʃʒ}\foo{pbtdkvsʃxhmnɲ}\foo{vmnɲjr̝rl} 
\foo{fvsz}\foo{tdsz}kvj

%\parbox{0pt}{\hspace{0pt}\foo{pbfvmtdszncɟʃʒɲkɡxhlrr̝j} \foo{pbtdkvsʃxhmnɲ}}

\end{document}

取消注释该行以查看添加的\parbox所有点。\-

在此处输入图片描述

答案3

如果您可以自由使用 LuaLaTeX,那么设置一个 Lua 函数来修改字符串以便换行符可能无处不在就很简单了。该代码可以处理几乎所有 utf8 编码的字符 - 它们不需要进行 ascii 编码。

请注意,这种方法不是在行尾生成连字符。在我看来,没有连字符实际上可能是一个优势,因为现在不会产生歧义,即恰好-出现在行尾的字符是 LaTeX 插入的连字符还是长字符串中已经存在的字符。如果您确实需要以连字符结尾的行,只需将以下代码更改'%1\\hspace{0pt}'为。'%1\\-'

在此处输入图片描述

\documentclass{article}
\usepackage{fontspec}
\setmainfont{XITS}
\usepackage{luacode} % for 'luacode' env. and '\luastringN' macro
\begin{luacode}
function gentle_split ( s )
   s = unicode.utf8.gsub ( s , '(.)' , '%1\\hspace{0pt}' )
   tex.sprint ( s )
end
\end{luacode}
\newcommand{\GentleSplit}[1]{\directlua{gentle_split(\luastringN{#1})}}

\begin{document}

\noindent
\GentleSplit{∅ p b f v m t d s z n c ɟ ʃ ʒ ɲ k ɡ x h l r r̝ j [pbfvmtdszncɟʃʒɲkɡxhlrr̝j][pbtdɡfvszʃʒxjrr̝lmnɲ] [tdkvszxhjrr̝lpbɡfʃʒxmnɲ][pbtdkfvszʃʒxhr̝mnɲ][pbtdcɟkvsʃʒxhmnɲjr̝rl] [thlpbtdfvszʃʒmnɲ][tkszxhr̝dʃʒ][pbtdkvsʃxhmnɲ][vmnɲjr̝rl] [fvsz][tdsz]kvj}

\medskip
\noindent
\GentleSplit{[ɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒɟʃʒ]}
\end{document}

答案4

还有一种基于 的方法luatex,它允许\patterns在文档中声明一种新语言,然后为其分配一组连字模式。

\documentclass{article}

\newlanguage\ipalang
\begingroup
  \language\ipalang
  \patterns{1∅ 1p 1b 1f 1v 1m 1t 1d 1s 1z 1n 1c 1ɟ 1ʃ 1ʒ 1ɲ 1k 1ɡ 1x 1h
  1l 1r 1r̝ 1j}
  % \prehyphenchar=-1 % If you don’t want hyphens
\endgroup

\usepackage{fontspec}
\setmainfont{XITS}

\newcommand\ipatext[1]{{%
  \language\ipalang
  \lefthyphenmin=1
  \righthyphenmin=1
  #1}}

\begin{document}

\hsize1pt

Start paragraph
\ipatext{[vmtdszncɟʃʒɲkɡxhlrr̝j][dɡfvszʃʒxjrr̝lmnɲ]}
End paragraph.

\end{document}

在此处输入图片描述

相关内容