用更温和的东西代替 cmtt10 \char32 (可见杯空间)?

用更温和的东西代替 cmtt10 \char32 (可见杯空间)?

我正在排版源代码,我想用一些更容易看的东西来替换 cmtt10 \char32。我想出了一个我喜欢的东西,但我对实现并不满意。它看起来是这样的……顶部是标准杯空间;底部是我的替换版本:

样本

有没有更简单或更干净的方法来完成我所做的工作?(1)我必须包括tipa的包\textbottomtiebar。(2)碰巧的是,出于某种在我看来很奇怪的原因,该包aeguill修改了这个底部拉杆以使其变宽,而这正是我想要的。但我觉得这种组合很笨拙,很脆弱。

至于实现的核心,它使用\ooalign\hss\hphantom将微小的底部领带置于空格字符的标准宽度内:

\documentclass{article}

\usepackage{tipa} % For \textbottomtiebar
\usepackage[lm]{aeguill} % For some reason, widens the bottom tie

\newcommand{\visp}{%  Acronym for "VIsible SPace"
  \ooalign{%
    \relax\cr%
    \hss{\tiny\textbottomtiebar{\ }}\hss\cr%
    \hphantom{~}\cr%
  }%
}

\begin{document}

\texttt{Hello,{\char32}world!{\char32}{\char32}I{\char32}am{\char32}a{\char32}string.} ~~~ $\backslash$char32
\vskip 1em
\texttt{Hello,{\visp}world!{\visp}{\visp}I{\visp}am{\visp}a{\visp}string.} ~~~ $\backslash$visp

\end{document}

对我来说,这比 有很大改进\char32,我很乐意用\char32它代替,但由于 TeX 内部的工作方式,我怀疑这是否可行。所以我\visp在我的风格序言中给了它这个名字。

答案1

您必须修补verbatim*环境和\verb*命令:

\documentclass{article}
\usepackage[T3,OT1]{fontenc}
\usepackage{etoolbox}
\usepackage[lm]{aeguill} % is it really needed?

\newcommand{\visp}{%
  \makebox[.5em]{\vphantom{Xg}\raisebox{-\height}{\smash{\tiny
    \fontencoding{T3}\fontfamily{cmr}\selectfont\textbottomtiebar}}}}

\makeatletter
\def\@space@visp{\begingroup\lccode`\~=`\ \lowercase{\endgroup\let~}\visp}
\pretocmd\@sverb{\catcode`\ =\active\@space@visp}{}{}
\global\@namedef{verbatim*}{\@verbatim\catcode`\ =\active\@space@visp\@sxverbatim}
\makeatother

\begin{document}

\begin{verbatim*}
abc def ghi
\end{verbatim*}

\verb*|abc def|

\end{document}

没有理由加载tipa,因为声明 T3 编码就足够了。

在此处输入图片描述

现在使用该包很奇怪aeguill,因为加载 T1 编码而不是 OT1 就足以获得良好的 guillemets <<guillemets>>

答案2

您可以激活该空间并使用\visp宏。您可以定义一个宏,例如\enablevisp,为当前组的其余成员启用该空间。

\begingroup
\catcode`\ =\active%
\newcommand{\enablevisp}{%
\ttfamily%
\catcode`\ =\active%
\def {\visp}%
}%
\endgroup%

可以这样使用:

{\enablevisp{}Hello world! How are you?}

也可以定义一个\textvisp宏:

\makeatletter
\newcommand{\textvisp}{%
   \begingroup
   \enablevisp
   \@textvisp
}
\def\@textvisp#1{%
   #1%
   \endgroup
}
\makeatother

然后可以像这样使用:

\textvisp{Hello world! How are you?}

答案3

嗯,我找到了另外两个替代方案\textbottomtiebar。一个是\textvisiblespace,另一个是\smile。后者是一个数学模式字形,一开始太大了,所以我用它缩小了\scalebox

感谢@egreg 的提示,我清理了\textbottomtiebar解决方案,并提出了三种变体,如下所示\char32

我想在这里分享这些代码,以便其他人发现它们有用:

\documentclass{article}

\usepackage{graphicx}  % Only needed for the \smile version
\usepackage[T3,OT1]{fontenc}  % Only needed for the \textbottomtiebar version

% (a) \char32 version
\newcommand{\vispa}{%
  \char32%
}

% (b) \textvisiblespace version
\newcommand{\vispb}{%
  \ooalign{%
    \relax\cr%
    \noalign{\vskip.2ex}%
    \textvisiblespace\cr%
    \noalign{\vskip-.2ex}%
    \hphantom{~}\cr%   Width of a space character
    \vphantom{Xg}\cr%  Height of X, depth of g
  }%
}

% (c) \textbottomtiebar version
\newcommand{\vispc}{%
  \ooalign{%
    \relax\cr%
    \hss\smash{\tiny\fontencoding{T3}\fontfamily{cmr}%
               \selectfont\textbottomtiebar}\hss\cr%
    \hphantom{~}\cr%   Width of a space character
    \vphantom{Xg}\cr%  Height of X, depth of g
  }%
}

% (d) \smile version
\newcommand{\vispd}{%
  \ooalign{%
    \relax\cr%
    \noalign{\vskip.5ex}%
    \hss\scalebox{.4}{$\smile$}\hss\cr%
    \noalign{\vskip-.5ex}%
    \hphantom{~}\cr%   Width of a space character
    \vphantom{Xg}\cr%  Height of X, depth of g
  }%
}

% Just for demonstration and testing
\newcommand{\testvisp}[2]{%
  ``\texttt{abc{#1}def{#1#1#1#1}ghi}''%
  \quad{\tiny$\backslash$#2}\par
}

\begin{document}
\testvisp{\vispa}{char32}
\testvisp{\vispb}{textvisiblespace}
\testvisp{\vispc}{textbottomtiebar}
\testvisp{\vispd}{smile}
\end{document}

相关内容