削减零是“正确”的方式吗?

削减零是“正确”的方式吗?

我们的文件中的数字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

已编辑以更好地展示该技术,用作txttttfont。

修复末尾的 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 未被反转。

在此处输入图片描述

相关内容