使不可断开的空格 (~) 在 PDF 中可见并保留其粘合

使不可断开的空格 (~) 在 PDF 中可见并保留其粘合

我使用多种工具来简化编辑过程以及行和布局优化。作为其中之一,我想~直接查看我在 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}

我的 MWE 截图

这就是我所追求的或类似的: 我的梦想截图

我找不到单词间空格的默认粘连以及如何在其中放置符号。如果可能的话,~还应重新定义,以免造成额外错误,因为它用于章节标题和参考书目等。

答案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}

在此处输入图片描述

相关内容