如何拆分包含符号但没有连字符的长单词?

如何拆分包含符号但没有连字符的长单词?

以下是我的最小工作示例:

\documentclass[10pt,a4paper,draft]{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{lipsum}
\begin{document}
Thisisaverylongtexttosimulateerror “firstterm*[title/abstract] AND (secondterm*[title/abstract] OR thirdterm*[title/abstract])” \lipsum[2]
\end{document}

输出结果如下:
在此处输入图片描述

我尝试使用hyphenat带有\fshyp命令的软件包在正斜杠处对单词进行连字符处理,但这也会添加一个连字符,而我并不需要。如何在不添加连字符的情况下在 * 或 / 处断开单词?

答案1

手动解决方案:

您也可以手动进行,通过\BreakableChar在适当的位置插入:

Thisisaverylongtexttosimulateerror “firstterm*[title/abstract] AND 
(secondterm*\BreakableChar{}[title/abstract] OR thirdterm*[title/abstract])”

这里的一个小问题是我已经\BreakableChar用一个可选参数进行了定义,并且由于您后续的文本以 开头[,因此需要使用{}

自动化解决方案:

您可以采用以下解决方案长行文本自动换行 也可以自动在您想要的位置插入可中断字符。要使用此功能,只需将整个字符串传递给\AddBreakableChars{}

Thisisaverylongtexttosimulateerror “firstterm*[title/abstract] AND 
\AddBreakableChars{(secondterm*[title/abstract]} OR thirdterm*[title/abstract])”

它的当前定义将\BreakableChar在任何*或之后插入一个\。这可以扩展以应用于其他字符。我还在注释代码中展示了当您想要断开某个字符但又不想插入连字符时该怎么做。

结果:

这是原始文本,后面是将术语提供给自动化\AddBreakableChars{}宏的文本,以及\BreakableChar在适当位置手动插入的文本:

在此处输入图片描述

代码:

\documentclass{article}

\usepackage{showframe}
\usepackage{hyphenat}
\usepackage{xstring}
\usepackage{forloop}

\newsavebox\MyBreakChar%
\sbox\MyBreakChar{}% char to display the break after non char
\newsavebox\MySpaceBreakChar%
\sbox\MySpaceBreakChar{\hyp}% char to display the break after space
\makeatletter%
\newcommand*{\BreakableChar}[1][\MyBreakChar]{%
  \leavevmode%
  \prw@zbreak%
  \discretionary{\usebox#1}{}{}%
  \prw@zbreak%
}%
\makeatother

\newcounter{index}%
\newcommand{\AddBreakableChars}[1]{%
  \StrLen{#1 }[\stringLength]%
  \forloop[1]{index}{1}{\value{index}<\stringLength}{%
    \StrChar{#1}{\value{index}}[\currentLetter]%
    \IfStrEqCase{\currentLetter}{%
        % All the characters where you don't want hypen
        {*}{\currentLetter\BreakableChar[\MyBreakChar]}%
        {/}{\currentLetter\BreakableChar[\MyBreakChar]}%
        % All the charactes where a break should have a hypen
        %{ }{\currentLetter\BreakableChar[\MySpaceBreakChar]}%
    }[\currentLetter]%
  }%
}%

\begin{document}
\noindent\textbf{Original Text}:
\par\noindent
Thisisaverylongtexttosimulateerror “firstterm*[title/abstract] AND 
(secondterm*[title/abstract] OR thirdterm*[title/abstract])”

\medskip
\noindent\textbf{Use automated} \verb|\AddBreakableChars|:
\par\noindent
Thisisaverylongtexttosimulateerror “firstterm*[title/abstract] AND 
\AddBreakableChars{(secondterm*[title/abstract]} OR thirdterm*[title/abstract])”

\medskip
\noindent\textbf{Use manual} \verb|\BreakableChar|:
\par\noindent
Thisisaverylongtexttosimulateerror “firstterm*[title/abstract] AND 
(secondterm*\BreakableChar{}[title/abstract] OR thirdterm*[title/abstract])”
\end{document}

答案2

我知道这是一个老话题,但以防万一:

如果使用\slash{}而不是 ,则/可以在斜线后出现中断。

通过类比,我们可以\sta根据上面的 Peter Grill 代码进行定义:

\newsavebox\MyBreakChar%
\sbox\MyBreakChar{}% char to display the break after non char
\newsavebox\MySpaceBreakChar%
\sbox\MySpaceBreakChar{\hyp}% char to display the break after space
\makeatletter%
\newcommand*{\BreakableChar}[1][\MyBreakChar]{%
  \leavevmode%
  \prw@zbreak%
  \discretionary{\usebox#1}{}{}%
  \prw@zbreak%
}%
\makeatother
\newcommand{\sta}{*\BreakableChar{}}

\slash如果您习惯于在希望中断的情况下使用,这将会很方便。

答案3

一种可能性是,溢出边距的“单词”无法在最理想的位置进行连字符处理。在此示例中,情况恰好如此——“secondterm”仅被 tex 连字符化为“sec-ondterm”。添加此命令

\hyphenation{sec-ond-term}

将提供另一种连字符的可能性。

我也没有看到您选择了语言,因此可能没有调用连字模式。但我不认为这是问题,因为如果您将其指定\begin{sloppypar} ... \end{sloppypar}为段落的包装器,它确实会连字为“sec-ondterm”。

这不适用于非字母字符串,但您可以通过使用以下命令运行 tex 来检查字母字符串中是否有可接受的连字符点:

tex
\relax
\showhyphens{secondterm and other words to be looked at}
\bye

然后您可以添加自己的\hyphenation{...}例外情况。

相关内容