![使不可断开的空格 (~) 在 PDF 中可见并保留其粘合](https://linux22.com/image/374861/%E4%BD%BF%E4%B8%8D%E5%8F%AF%E6%96%AD%E5%BC%80%E7%9A%84%E7%A9%BA%E6%A0%BC%20(~)%20%E5%9C%A8%20PDF%20%E4%B8%AD%E5%8F%AF%E8%A7%81%E5%B9%B6%E4%BF%9D%E7%95%99%E5%85%B6%E7%B2%98%E5%90%88.png)
我使用多种工具来简化编辑过程以及行和布局优化。作为其中之一,我想~
直接查看我在 PDF 中放置不可中断空格的位置,以便更好地理解为什么选择某些断点和拉伸。
如何重新定义~
以在 PDF 中显示 - 可能是文字波浪符号 ~ - 而不影响换行?因此,替换应具有与原始完全相同的可拉伸性和可收缩性~
,当然,仍然不会中断。
我迄今为止的尝试:
\documentclass{article}
\usepackage{color}
\newcommand\testline{Lorem~ipsum dolor~sit\linebreak}
\begin{document}\noindent\hsize 5cm
\testline
\def~{\textcolor{blue}{\textasciitilde}}
\testline
\end{document}
我找不到单词间空格的默认粘连以及如何在其中放置符号。如果可能的话,~
还应重新定义,以免造成额外错误,因为它用于章节标题和参考书目等。
答案1
以下是将两个单词之间的点居中的两种解决方案:
\def\visiblenobreakspacesymbol{$\cdot$}
\let\invisiblenobreakspace=~
\newdimen\fontdimentwo
\newdimen\fontdimenthree
\newdimen\fontdimenfour
\protected\def\visiblenobreakspace{%
\fontdimentwo=\fontdimen2\font
\fontdimenthree=\fontdimen3\font
\fontdimenfour=\fontdimen4\font
\fontdimen2\font=\dimexpr\fontdimen2\font/2\relax
\fontdimen3\font=\dimexpr\fontdimen3\font/2\relax
\fontdimen4\font=\dimexpr\fontdimen4\font/2\relax
\invisiblenobreakspace
\hbox to 0pt{\hss\visiblenobreakspacesymbol\hss}%
\invisiblenobreakspace
\fontdimen2\font=\fontdimentwo
\fontdimen3\font=\fontdimenthree
\fontdimen4\font=\fontdimenfour}
\def~{\visiblenobreakspace}
和
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\newcommand{\visiblenobreakspacesymbol}{$\cdot$}
\let\invisiblenobreakspace=~
\newcounter{nbsp}
\DeclareRobustCommand{\visiblenobreakspace}{%
\stepcounter{nbsp}%
\tikzmark{{nbsp-left\arabic{nbsp}}}%
\invisiblenobreakspace
\tikzmark{{nbsp-right\arabic{nbsp}}}%
\tikz[remember picture,overlay]
\path ({pic cs:nbsp-left\arabic{nbsp}})
-- ({pic cs:nbsp-right\arabic{nbsp}})
node [midway,anchor=base] {\visiblenobreakspacesymbol};}
\AtBeginDocument{\renewcommand{~}{\visiblenobreakspace}}
第一个解决方案应该可以在任何具有 e-TeX 的 TeX 引擎上运行。第二个解决方案需要两次传递,但功能更强大;稍作更改即可得到以下输出:
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\let\invisiblenobreakspace=~
\newcounter{nbsp}
\DeclareRobustCommand{\visiblenobreakspace}{%
\stepcounter{nbsp}%
\tikzmark{{nbsp-left\arabic{nbsp}}}%
\invisiblenobreakspace
\tikzmark{{nbsp-right\arabic{nbsp}}}%
\tikz[remember picture,overlay]
\draw ({pic cs:nbsp-left\arabic{nbsp}}) -- +(0,-0.3ex)
-| ({pic cs:nbsp-right\arabic{nbsp}});}
\AtBeginDocument{\renewcommand{~}{\visiblenobreakspace}}
答案2
这是一个可能的解决方案:
\documentclass{article}
\usepackage{color}
\newcommand\testlinei{Lorem~ipsum dolor~sit\linebreak}
\newcommand\testlineii{Lorem~ipsum dolor~sit~skdjfh~skdhf~skfdh~sdf\linebreak}
\begin{document}\noindent\hsize 5cm
\testlinei
\testlineii
\let\oldtilde=~
\def~{\rlap{\textcolor{blue}{$\cdot$}}\oldtilde}
\testlinei
\testlineii
\end{document}
答案3
您可以使用领导者:
\documentclass{article}
\usepackage{color}
\newcommand\testline{Lorem~ipsum dolor~sit\linebreak no underfull}
\renewcommand~{\visiblenobreakspace{}}
\DeclareRobustCommand\visiblenobreakspace{%
\leavevmode\nobreak
\cleaders\hbox to 0.3em{\hss\textcolor{blue}{\v{}}\hss}\hskip
\ifdim\spaceskip>0pt
\spaceskip
\else
\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font
\fi
}
\begin{document}
\noindent\hsize 5cm
\testline
\end{document}
相反,有了规则,
\documentclass{article}
\usepackage{color}
\newcommand\testline{Lorem~ipsum dolor~sit\linebreak no underfull}
\renewcommand~{\visiblenobreakspace{}}
\DeclareRobustCommand\visiblenobreakspace{%
\leavevmode\nobreak
{\color{blue}%
\cleaders\hrule height 1ex depth -0.7ex\hskip
\ifdim\spaceskip>0pt
\spaceskip
\else
\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font
\fi
}%
}
\begin{document}
\noindent\hsize 5cm
\testline
\end{document}