我正在做一个图书项目(梵文),其中的诗句被分解成单个单词,每个单词的含义都如下面的 MWE 所示。左侧是原文中的单词,右侧是这些单词的详细说明。每行根据需要使用符号=
和->
, ;
和।
(unicode 2404)。我将MWE 中的unicode 替换।
为 ascii 。|
我想防止=
、->
和;
全部।
出现在每行的开头。我设法।
通过将 字符与 中的前一个单词一起包装来实现这一点\mbox{}
。但是,对其他字符执行相同操作不会产生相同的结果。
\documentclass{report}
\usepackage[outline]{contour}
\begin{document}
\begin{sloppypar}
\noindent
\textbf{pratipadārthaḥ} \contour{black}{$\Rightarrow$}
\textit{\textbf{kayācit}} = kayācit kanyayā ;
\textit{\textbf{nalam}} = nalam ;
\textit{\textbf{ālokya}} = dṛṣṭvā ;
\textit{\textbf{lalajje}} = lajjā \mbox{prāptā |}
\textit{\textbf{kayā api}} = kayācit kanyayā ;
\textit{\textbf{tat+bhāsi}} $\rightarrow$ tat = nalasya, bhāsi = kāntyām ;
\textit{\textbf{hṛdā}} = cittena ;
\textit{\textbf{mamajje}} = majjanaṃ \mbox{kṛtam |}
\textit{\textbf{kā api}} = kācit kanyā ;
\textit{\textbf{tam}} = taṃ nalam ;
\textit{\textbf{smaram eva}} = manmatham eva ;
\textit{\textbf{mene}} = \mbox{bhāvitavatī|}
\textit{\textbf{anyā }} = anyā kanyā ;
\textit{\textbf{manobhū+vaśabhūyam}} $\rightarrow$ manobhū = manmathasya, vaśabhūyam = vaśatvam ;
\textit{\textbf{bheje}} = \mbox{prāptavatī |}
\end{sloppypar}
\end{document}
在上面的输出中,=
和;
出现在行首。根据文本的不同,其他字符也可能出现在此位置。有办法防止这种情况发生吗?更广泛地说,我需要将此更改应用于大约 1000 个已经输入的文本块,并且正在寻找一种可以应用最少更改的解决方案。如果没有这样的解决方案,我也很乐意使用其他解决方案。
答案1
(仅总结之前的评论,以便该查询可被视为已收到“官方”答复)
在 TeX 和 LaTeX 文档中,输入字符~
默认定义为“连接符”或“不可中断空格”。因此,如果您将所有;
|
、$\to$
和替换为、~=
和,您将摆脱大多数不必要的换行符。~;
~|
~$\to$
~=
我还会执行\raggedright
关闭连字符(和对齐)的操作。这样您就不必在\mbox
指令中将各种单词括起来。
\documentclass{report}
\newcommand\textbfit[1]{\textbf{\textit{#1}}}
\usepackage[outline]{contour}
\begin{document}
\raggedright
\textbf{pratipadārthaḥ} \contour{black}{$\Rightarrow$}
\textbfit{kayācit}~= kayācit kanyayā~;
\textbfit{nalam}~= nalam~;
\textbfit{ālokya}~= dṛṣṭvā~;
\textbfit{lalajje}~= lajjā prāptā~|
\textbfit{kayā api}~= kayācit kanyayā~;
\textbfit{tat\textup{+}bhāsi}~$\to$ tat~= nalasya, bhāsi~= kāntyām~;
\textbfit{hṛdā}~= cittena~;
\textbfit{mamajje}~= majjanaṃ kṛtam~|
\textbfit{kā api}~= kācit kanyā~;
\textbfit{tam}~= taṃ nalam~;
\textbfit{smaram eva}~= manmatham eva~;
\textbfit{mene}~= bhāvitavatī|
\textbfit{anyā }~= anyā kanyā~;
\textbfit{manobhū\textup{+}vaśabhūyam}~$\to$ manobhū~= manmathasya, vaśabhūyam~= vaśatvam~;
\textbfit{bheje}~= prāptavatī~|
\end{document}
附录针对 OP 的评论:如果你可以自由地使用 LuaLaTeX 而不是 XeLaTeX,并且如果你对 Lua 的字符串函数比较熟悉,那么设置一个 Lua 函数来扫描输入材料(就像一个预处理器)并在 、 、 和 之前创建必要的不可破坏的空间是相当;
简单=
的|
。$\to$
自动地:如果这些字符前有一个可断开的空格,则将其替换为不可断开的空格,如果还没有空格,插入一个新的不可中断空格。以下示例显示了如何执行此操作。请注意,我故意弄乱了输入,使得字符前没有空格,而在其他情况下则有一个或多个空格字符。
% !TEX TS-program = lualatex
\documentclass{report}
\newcommand\textbfit[1]{\textbf{\textit{#1}}}
\usepackage[outline]{contour}
\usepackage{luacode} % for 'luacode' env.
% Define a Lua function called 'nobreakspace'
\begin{luacode}
function nobreakspace ( s )
s = s:gsub ( "%s-([=;|])" , "~%1" ) -- a Lua char. class that contains = ; |
s = s:gsub ( "%s-(%$\\to%$)" , "~%1" )
s = s:gsub ( "+", "\\textup{+}" ) -- don't render '+' symbols in italics
return s
end
\end{luacode}
% Define LaTeX utility macros to activate and deactivate the Lua function:
\newcommand\NobreakspaceOn{\directlua{luatexbase.add_to_callback (
"process_input_buffer", nobreakspace, "nobreakspace") }}
\newcommand\NobreakspaceOff{\directlua{luatexbase.remove_from_callback (
"process_input_buffer", "nobreakspace") }}
\begin{document}
\NobreakspaceOn % <-- Activate the Lua function *by assigning it to the
% 'process_input_buffer' callback)
\raggedright
\textbf{pratipadārthaḥ} \contour{black}{$\Rightarrow$}
\textbfit{kayācit} = kayācit kanyayā;
\textbfit{nalam} = nalam;
\textbfit{ālokya} = dṛṣṭvā;
\textbfit{lalajje} = lajjā prāptā |
\textbfit{kayā api} = kayācit kanyayā ;
\textbfit{tat+bhāsi}$\to$ tat = nalasya, bhāsi = kāntyām;
\textbfit{hṛdā} = cittena;
\textbfit{mamajje} = majjanaṃ kṛtam |
\textbfit{kā api} = kācit kanyā;
\textbfit{tam} = taṃ nalam ;
\textbfit{smaram eva} = manmatham eva ;
\textbfit{mene} = bhāvitavatī |
\textbfit{anyā} = anyā kanyā;
\textbfit{manobhū+vaśabhūyam} $\to$ manobhū = manmathasya, vaśabhūyam = vaśatvam;
\textbfit{bheje} = prāptavatī|
\end{document}