我正在排版源代码,我想用一些更容易看的东西来替换 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}