单词内的命令将使该单词在 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
,并且我还在{}
复合句的末尾放了一个 ,但都没有任何效果。无论如何,空格确实出现在行尾以外的其他地方,所以这不是问题。
编辑
可能发生的另一个问题是连字符前一个字:
由上例中的以下一行引起。
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 括号{
,而不会看到空格。我删除了{}
这里。