我有一篇长文,其中包含许多国际音标 (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}