是否可以重新定义空白命令?

是否可以重新定义空白命令?

我想用其他东西替换空格(通过按键盘上的“空格”任意多次或按 Enter 键输入的完整空格)。比如说,相同宽度的规则。

是否有一些命令可以重新定义?保持空白区域伸展的最简单方法是突出显示它们。

我已经知道我可以通过包获得类似的东西,lua-visual-debug并且调试是重新定义的目的,但我想在 pdfLaTeX 中做到这一点。

如果我们能够找到一个简单的答案,我们可能会得到一些调试“虚假空白错误”的参考。

当然,我为此给出了 MWE。插入重新定义后,第一行应该产生第二行(希望不是使用规则的硬编码宽度)。

% arara: pdflatex

\documentclass{article}
\usepackage{xcolor}
\definecolor{spacecolor}{named}{red}
\newcommand*{\test}{%
    Test}
\newcommand{\yatest}{
    Test
    }
\newcommand*{\here}{\textcolor{spacecolor}{\rule{.335em}{1.5ex}}}
\usepackage{lua-visual-debug}

\begin{document}
Test Test    Test \test\yatest\test 

Test\here{}Test\here{}Test\here{}Test\here{}Test\here{}Test
\end{document}

在此处输入图片描述

答案1

借用 Marcin Woliński 的代码“如何让换行符处的方框消失”,已经用于我的答案检查是否在一行的开头

\documentclass{article}
\newcommand{\AND}{%
  \leaders\hrule height 1.5ex
  \hskip\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font
  }

\newenvironment{showspaces}
 {\par\obeyspaces\obeylines
  \begingroup\lccode`\~=`\ \lowercase{\endgroup\let~}\AND
  \begingroup\lccode`\~=`\^^M\lowercase{\endgroup\let~}\AND}
 {\par}

\begin{document}

\begin{showspaces}%
some text some text someveryverylongword text text
some text some text someveryverylongword text text
some text some text someveryverylongword text text
some text some text someveryverylongword text text
some text some text someveryverylongword text text
\end{showspaces}

\end{document}

在此处输入图片描述

答案2

pdfTeX 1.40.15 的新功能\pdfinterwordspaceon可用于获得微小的可见空间,而 TeX 会放置一个不可见的空间。该功能的目的是通过移动到下一个字符位置,在输出中出现真正的空格字符,而不是纯白色空格。通过将字体更改为cmtt10,在空格位置有一个可见的空格:

\pdfmapline{=dummy-space <cmtt10.pfb}
\pdfglyphtounicode{space}{0042}

\documentclass{article}

\newcommand{\foo}{Some text with }

\begin{document}
\pdfinterwordspaceon
\foo faked interword spaces.
\end{document}

结果

缺点:

  • 字符的比例非常小,即使有可见的字符,也几乎看不见。

  • 连续的多个空格合并为一个空格字符。

  • \hskip更糟糕的是,在或命令中也会出现空格字符的添加 \kern

优势:

  • 至少这种方法可以对隐藏在宏中的不需要的空间获得一些有用的视觉反馈,其中类别代码的更改有太多的副作用。

至少,可以通过对 PDF 文件进行后期处理来改善可见空间的外观。

答案3

Knuth 的CWEB程序会自动为 C 程序中的字符串常量插入可见的空格字符,如本例所示(保存为space.w,编译为cweave space && pdftex space)。

@ \.{CWEB}, show me how you format spaces in string constants.

@p
#include <stdio.h>
static const char greeting[] = "H e l l o  ,   w o r l d !\n";
int main(void)
{
    printf("%s", greeting);
    return(0);
}

在此处输入图片描述

此行为在中定义cwebmac.tex,并且我在此示例中仅修改了显示 LaTeX 空格的部分:

\documentclass{article}
\newcommand{\SP}{\texttt{\char`\ }} % (visible) space in a string
\newcommand{\showspaces}[1]{\begingroup\let\ =\SP #1\endgroup}
\begin{document}

Test\SP Test\SP\SP % method one

\showspaces{Test\ Test\ \ } % method two

\end{document}

在此处输入图片描述

CWEB通过预处理.w仅包含"H e l l o"空格的输入文件并生成.tex包含的文件来自动完成此H\ e\ l\ l\ o操作。特别是如果这是出于测试目的,预处理器方法可能也适合您。例如,一个相当简单的 C 程序可以.tex一次读取一个字符的文件,并且每次读取空格时它都可以替换\SP

类似这样的内容可能是核心算法:

if ((c = fgetc(infile)) == ' ') 
    fprintf(outfile, "\\SP");
else fputc(c, outfile);

相关内容