允许对包含命令的单词进行连字符连接

允许对包含命令的单词进行连字符连接

单词内的命令将使该单词在 Latex 中无法连字符,从而产生丑陋的结果overfull \hbox,请参见示例输出的第一行。在以下示例中:

\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setdefaultlanguage{sanskrit}
\newfontfamily\sanskritfont{Latin Modern Roman}

\newenvironment{fixhyphenation}{%
\let\oldtextbf\textbf
\renewcommand{\textbf}[1]{\hspace{0pt}\oldtextbf{##1}\hspace{0pt}}
}
{}

\begin{document}

XXX XXX XXX XXX XXX XXX  navanīrabhāra\textbf{bhara}mantharāmbudastanitātiḍambaragabhīrayā

XXX XXX XXX XXX XXX XXX  \begin{fixhyphenation}navanīrabhāra\textbf{bhara}mantharāmbudastanitātiḍambaragabhīrayā\end{fixhyphenation}

XXX XXX XXX XXX XXX XXX XXX XXX XXX  \begin{fixhyphenation}navanīrabhāra\textbf{bhara}mantharāmbudastanitātiḍambaragabhīrayā\end{fixhyphenation}


\end{document}

环境fixhyphenation允许在较长的梵文复合词中使用连字符,其中一部分以粗体显示,方法是让 tex 认为它处理的是三个单词。(第二行)我的想法是以相同的方式重新定义所有可以在单词中发生的命令,尽管这可能会得到一个很长的列表。但是,如果换行符恰好位于粗体序列的开头或结尾,我们自然会错过所需的连字符。(第三行)

示例输出

我该如何编写一个命令

  • 检查其位置是否发生换行

  • 如果是这种情况,则在换行符前用连字符替换自身

  • 如果没有换行符,则将其自身替换为\hspace{0pt}

?或者有没有更优雅的方式来做到这一点,让我免于重新定义可能很长的命令列表,并将相关的单词括在环境中?

编辑:在手动使用之后,我现在开始将其合并到命令中。目前,我没有重新定义旧命令,而是定义新命令,例如\wfm{}这里。但现在有一个不良影响:如果我将复合词末尾的音节加粗,并且该位置一行已满,我将得到连字符而不是空格。如果没有换行符,我会得到所需的空格。请参见以下示例:

\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setdefaultlanguage{sanskrit}
\newfontfamily\sanskritfont{Latin Modern Roman}

\newcommand{\comglue}{\discretionary{-}{}{}\nobreak\hspace{0pt}}
\newcommand{\wfm}[1]{\comglue\textbf{\textsanskrit{#1}}\comglue}

\begin{document}

XXXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambara\wfm{gabhīrayā} girā

navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambara\wfm{gabhīrayā} girā

\end{document}

第二个例子

\comglue我尝试在 的定义中将放在 s 后面\wfm,并且我还在{}复合句的末尾放了一个 ,但都没有任何效果。无论如何,空格确实出现在行尾以外的其他地方,所以这不是问题。

编辑

可能发生的另一个问题是连字符一个字:

示例 3

由上例中的以下一行引起。

XXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambaragabhīrayā \wfm{girā}

值得注意的是,连字符不是连接到前面的单词,而是连接到作为命令\hspace{0pt}一部分的前面\comglue。也许可以扩展 ,\comglue通过两个测试分别测试其开头和结尾的前面或后面的空格,如果为真,则抑制 的输出\discretionary{-}{}{}\nobreak\hspace{0pt}。让我们看看。

编辑:我又向前迈了一小步。我现在可以测试以下空间:

\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage{amsgen}%for the command \new@ifnextchar, with which one can test for a space.
\setdefaultlanguage{sanskrit}
\newfontfamily\sanskritfont{Latin Modern Roman}

\makeatletter
\newcommand{\comglue}{\new@ifnextchar { }{\discretionary{-}{}{}\nobreak\hspace{0pt}}}
\makeatother

\newcommand{\wfm}[1]{\comglue{}\textbf{\textsanskrit{#1}}\comglue{}}

\begin{document}

XXXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambara\wfm{gabhīrayā} girā

navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambara\wfm{gabhīrayā} girā

XXXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambaragabhīrayā \wfm{girā}

XXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambaragabhīrayā \wfm{girā}

\end{document}

所以现在第三行给了我想要的输出:

第四个例子

但是这仍然无法测试 1) 前面的空格、2) 换行符和其他可能的空格(例如制表符)。我该如何做这些?

答案1

如果我理解正确的话我想你想要类似的东西

\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage{amsgen}%for the command \new@ifnextchar, with which one can test for a space.
\setdefaultlanguage{sanskrit}
\newfontfamily\sanskritfont{Latin Modern Roman}

\makeatletter
\DeclareRobustCommand{\comglue}{\relax%
\new@ifnextchar { }{}{\ifhmode\ifdim\lastskip>\z@
  \discretionary{-}{}{}\nobreak\hspace{0pt}%
  \fi\fi}}
\makeatother

\newcommand{\wfm}[1]{\comglue\textbf{\textsanskrit{#1}}\comglue}

\begin{document}

XXXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambara\wfm{gabhīrayā} girā

navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambara\wfm{gabhīrayā} girā

XXXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambaragabhīrayā \wfm{girā}

XXXXX navanīrabhāra\wfm{bhara}mantharāmbudastanitātiḍambaragabhīrayā \wfm{girā}

\end{document}

这将测试是否存在后续空格,如果有,则不执行任何操作,否则将检查我们是否处于 h 模式(即不在段落的开头),然后如果测试没有遵循非零跳过(通常是单词空格),则添加自由裁量项。

还请注意,您对以下空格的测试将始终为假,\comglue{}因此测试将始终看到 oprn 括号{,而不会看到空格。我删除了{}这里。

相关内容