我们的文件中的数字0
,例如这个(外部 PDF 链接),在源代码块(lstlisting)中被“错误地”删除。
我们怎样才能在等宽字体中以“正确的方式”(从左下角到右上角)将其斜线化?
还可以将常规(无衬线)文本中的零以“正确的方式”加斜线,从而获得奖励。
更新:这些是用于定义样式的命令(一次,上下文在第 168 行)…
\newcommand{\listingsinpython}{
\definecolor{listinggray}{gray}{0.9}
\definecolor{lbcolor}{rgb}{0.9,0.9,0.9}
\lstset{
backgroundcolor=\color{lbcolor},
tabsize=4,
rulecolor=,
language=python,
basicstyle=\ttfamily,
upquote=true,
aboveskip={1.5\baselineskip},
columns=fixed,
showstringspaces=false,
extendedchars=true,
breaklines=true,
prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}},
frame=single,
showtabs=false,
showspaces=false,
showstringspaces=false,
keywordstyle=\color[rgb]{0,0,1},
commentstyle=\color[rgb]{0.133,0.545,0.133},
stringstyle=\color[rgb]{0.627,0.126,0.941},
}
}
% and use it in the document
\listingsinpython
…并得到输出(第 52 行中的上下文):
\begin{lstlisting}[language=c]
task main() {
SetSensorTouch(IN_1);
OnFwd(OUT_AB, 75);
while (Sensor(IN_1) == 0) {}
Off(OUT_AB);
}
\end{lstlisting}
(是的,“Python 中的列表”和“language=c”有点令人困惑,对此感到抱歉,这是代码的有机增长。)
答案1
这拖船文章Barbara Beeton 链接的文章深入研究了模糊零问题。在 LaTeX 的默认字体 Computer Modern 中,打字机字体中的零又窄又圆,而不是方正的大写字母“Oh”。但您可以选择其他等宽字体。
这LaTeX 字体目录提供了 TeXLive 完整发行版附带的所有等宽字体的列表,因此如果你在任何操作系统,您可能可以使用其中任何一种字体。字体目录中的每一页都包含数字的图像。
在大多数情况下,如目录所示,您只需在序言中调用字体包即可。大多数打字机字体包仅重新定义默认打字机系列,因此不会影响正在使用的其他字体。
您链接的文档使用 Nimbus Sans 作为正文(我可能会推荐基于它的 TeX Gyre Heroes)。要将其与从左下角到右上角带有斜线零的等宽字体匹配,您可以Anonymous Pro
像这样使用该包。(我不会尝试重现原始格式的所有格式。)
\documentclass{article}
% Set the necessary font encoding and input encoding
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
% Set the default sans-serif family and make it the default for body text
\usepackage{tgheros} % or \usepackage[scaled]{helvet} for URW Nimbus Sans
\renewcommand*\familydefault{\sfdefault}
% Set the default monospaced (teletype) family
\usepackage[ttdefault=true]{AnonymousPro}
% Use a package to allow verbatim code listings
% These will be set in the default monospace family (\ttdefault)
\usepackage{fancyvrb}
\begin{document}
\section*{Programm}
Dieses Programm geht davon aus, dass Du die Motoren mit den Anschlüssen A und B und den Sensor mit dem Anschluss 1 verbindest.
Wenn Du andere Anschlüsse verwenden möchtest, musst Du das Programm entsprechend anpassen (wenn Du magst, überlege Dir, wie).
\begin{Verbatim}
task main () {
SetSensorTouch (IN_1);
OnFwd (OUT_AB , 75);
while ( Sensor (IN_1) == 0) {}
Off( OUT_AB );
}
\end{Verbatim}
\end{document}
答案2
已编辑以更好地展示该技术,用作txtt
ttfont。
修复末尾的 FOLLOW UP 中给出的lstlisting
和\verb
(和\texttt
和):\ttfamily
这里,我展示了如何\scalebox
使用一个简单的宏来反转斜线\0
。我还展示了如何使0
活动宏允许人们在环境中使用零的反转版本verbatim
。
显然,我们不希望 0 一直处于活动状态,但在verbatim
环境中启用它是解决 OP 所提到的问题的可行方法。或者,在普通文本中,我们可以将反射图像调用为\0
。
\documentclass{article}
\renewcommand*\ttdefault{txtt}
\renewcommand*\familydefault{\ttdefault} %% Only if the base font of the document is to be typewriter style
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\newcommand\0{\scalebox{-1}[1]{0}}
\begin{document}
Default look of zero: 0
\begin{verbatim}
\verbatim 0123456789
\end{verbatim}
Setting zero to its mirror image
\catcode`0=\active
\def0{\0}
Revised look of zero: 0
\begin{verbatim}
\verbatim 0123456789
\end{verbatim}
\catcode`0=12% RESET MEANING OF 0
0 restored to original, but\\
I can still call on \0 at will.
\end{document}
跟进:
使用 egreg 的答案使用软件包列表时的电子邮件符号, 我可以自动地将反向 0 替换为其镜像lstlisting
(通过使用literate
)和\verb
参数(通过补丁)。
已编辑以修复\ttfamily
和\texttt
。但请注意,ttfamily
应将的使用分组,否则活动的0
可能会破坏其他内容。
\documentclass{article}
\usepackage{marvosym,listings,etoolbox}
% THIS REPLACES 0 with \0 IN lstings
\lstset{literate={0}{\0}1{0\ }{\0\ }2}
% THIS REPLACES 0 WITH \0 IN verb
\patchcmd{\verb}{\dospecials}{\dospecials\atspecial}{}{}
\def\atspecial{\begingroup\lccode`~=`0%
\lowercase{\endgroup\let~}\0%
\catcode`0=\active}
%
\renewcommand*\ttdefault{txtt}
% COMMENT THE NEXT LINE TO TURN OFF texttt AS DEFAULT FONT FAMILY
\renewcommand*\familydefault{\ttdefault} % makes base font typewriter style
\usepackage[T1]{fontenc}
\usepackage{graphicx}
% DEFINE \0 AS MIRROR OF 0
\newcommand\0{\scalebox{-1}[1]{0}}
% FIX FOR \texttt AND \ttfamily
\let\svttfamily\ttfamily
\let\svtexttt\texttt
\catcode`0=\active
\def0{\0}
\renewcommand\ttfamily{\svttfamily\catcode`0=\active }
\renewcommand\texttt{\bgroup\ttfamily\texttthelp}
\def\texttthelp#1{#1\egroup}
\catcode`0=12 %
%
\begin{document}
Here is the font's normal 0 (which is reverse sense)\par
But it is fixed (un-reversed) in lstlisting:
\begin{lstlisting}[framexleftmargin=0mm,
basicstyle=\ttfamily\small,
breaklines,
columns=fullflexible]
' 0000 having 1=1--
' or 1 in (select @@version)--
' union all select @@version 0.0--
' OR 'unusual' = 'unusual'
\end{lstlisting}\par
as well as in verb:~\verb|declare @s0 varchar(8000)|
\noindent\hrulefill
%Now we try it in texttt: \texttt{foo0bar} or this {\ttfamily foo0bar},
texttt: \texttt{foo0bar}
or back to 0
ttfamily: {\ttfamily foo0bar}
or back to 0 again
\noindent\hrulefill
I didn't break verb, did I? \verb|declare @s0 varchar(8000)|
\end{document}
通过注释掉\familydefault
重新定义,结果基本上就是 OP 所要求的:正常文本不变\rmfamily
,但在列表、逐字、ttfamily 和 texttt 中,反向 0 未被反转。