Meine Tags sind folgende:
\documentclass{book}
\usepackage{xcolor}
\usepackage{textcomp,listings}%
\lstnewenvironment{python}[1][]{%
\lstset{%
mathescape=false,%
language=python,%
basicstyle=\ttfamily\normalsize,%
otherkeywords={*,\{, \} },%
keywordstyle=\color{black},%
stringstyle=\color{black},%
showstringspaces=false,%
emph={class, pass, in, for, while, if, is, elif, else, not, and, or,%
def, print, exec, break, continue, return},%
emphstyle=\color{black}\bfseries,%
emph={[3]True, False, None, self},%
emphstyle=[2]\color{black!10},%
emph={[3]from, import, as},%
emphstyle=[3]\color{black},%
upquote=true,%
morecomment=[s]{"""}{"""},%
commentstyle=\color{gray}\slshape,%
aboveskip=12pt,belowskip=12pt,xleftmargin=-2pt,xrightmargin=3pt,framexleftmargin=20pt,framextopmargin=1pt,%
rulesepcolor=\color{gray},#1%
}}{}%
\begin{document}
\begin{python}
In [7]: np.searchsorted(X, 0.5)
Out[7]: 4998210 # This is 1 for test 1000
\end{python}
\begin{python}
In [7]: np.searchsorted(X, 0.5) # left edge 1234567890
from scipy import stats
dist stats.uniform (0, 2) # left edge 0, width 2
\end{python}
\end{document}
Es funktioniert einwandfrei, ohne Probleme. Bitte bestätigen Sie, dass ich es immer brauche arabic numerals (i.e., 0 to 9)
, roman
siehe Screenshot:
Kann das behoben werden? Bitte geben Sie mir einen Rat …
Antwort1
Hier ist eine Lösung, die den allgemeinen Ansatz zur Nummernhervorhebung nutzt, der inListings: Nummern nur aus Schlüsselwörtern färben.
Wir müssen einige Änderungen am OutputOther
Hook dieser Lösung vornehmen, da Sie in diesem Fall den Standardstil überschreiben möchten, unabhängig davon, ob Sie sich in einem Kommentar befinden oder nicht. Der neue Hook sieht folgendermaßen aus:
\lst@AddToHook{OutputOther}{%
\lst@ifparsenumbers
\expandafter\@hook@ifnumber\the\lst@token\@end {%
\let\orig@thestyle=\lst@thestyle
\def\lst@thestyle{\orig@thestyle\lst@numbersstyle}%
}{}%
\fi
}
\lstset
Außerdem müssen Ihrem Befehl die folgenden Zeilen hinzugefügt werden:
parsenumbers=true,
numbersstyle=\upshape
listings
Überall dort, wo in der Eingabe eine Zahl analysiert wird , numbersstyle
wird sie dem aktuell aktiven Stil hinzugefügt.
Vollständiger Beispielcode:
\documentclass{book}
\usepackage{xcolor}
\usepackage{textcomp,listings}%
\makeatletter
%%% Copied from https://tex.stackexchange.com/a/500690/23765
% Some conditional tests
\def\@genericif#1{#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\def\@ifdigit#1{\@genericif{\ifnum1<1\noexpand#1\relax}}
\def\@ifempty#1{\@genericif{\if\relax\detokenize{#1}\relax}}
% The main parsing macros
\def\parse@num#1{%
\@ifempty{#1}%
{\parse@num@false}%
{\@genericif{\parsesign}%
{\parse@num@sign#1{}\@end}%
{\parse@num@dig#1{}\@end}%
}%
}
% Parse sign
\def\parse@num@sign#1#2\@end{%
\@genericif{\ifx\parse@num@minus#1}%
{\@ifempty{#2}{\parse@num@false}{\parse@num@dig#2\@end}}%
{\@genericif{\ifx\parse@num@plus#1}%
{\@ifempty{#2}{\parse@num@false}{\parse@num@dig#2\@end}}%
{\parse@num@dig#1#2\@end}%
}%
}
% Parse first digit
\def\parse@num@dig#1#2\@end{%
\@ifdigit{#1}%
{\@ifempty{#2}{\parse@num@true}{\parse@num@digs#2\@end}}%
{\parse@num@false}%
}
% Parse optional following digits
\def\parse@num@digs#1#2\@end{%
\@ifdigit{#1}{%
\@ifempty{#2}%
{\parse@num@true}%
{\parse@num@digs#2\@end}%
}{%
\@genericif{\parsefloat}{%
\@genericif{\ifx\parse@num@point#1}%
{\@ifempty{#2}{\parse@num@false}{\parse@num@decs#2\@end}}%
{\parse@num@false}%
}{\parse@num@false}%
}%
}
% Parse decimal places
\def\parse@num@decs#1#2\@end{%
\@ifdigit{#1}{%
\@ifempty{#2}%
{\parse@num@true}%
{\parse@num@decs#2\@end}%
}{\parse@num@false}%
}
% User interface
\newcommand\ifnumber[4][]{%
\begingroup
\let\parsesign=\iftrue
\let\parsefloat=\iftrue
\let\parse@num@minus=-%
\let\parse@num@plus=+%
\let\parse@num@point=.%
#1%
\def\parse@num@true{\endgroup#3}%
\def\parse@num@false{\endgroup#4}%
\parse@num{#2}%
}
%%% Additions to the listings package
\lst@Key{numbersstyle}{}{\def\lst@numbersstyle{#1}}
\lst@Key{parsenumbers}{false}[t]{\lstKV@SetIf{#1}\lst@ifparsenumbers}
\lst@AddToHook{OutputOther}{%
\lst@ifparsenumbers
\expandafter\@hook@ifnumber\the\lst@token\@end {%
\let\orig@thestyle=\lst@thestyle
\def\lst@thestyle{\orig@thestyle\lst@numbersstyle}%
}{}%
\fi
}
\def\@hook@ifnumber#1#2\@end{%
\@genericif{\ifx\lst@nolig#1}%
{\@hook@ifnumber@{#2}}%
{\@hook@ifnumber@{#1#2}}%
}
\def\@hook@ifnumber@{%
\ifnumber[\expandafter\let\expandafter\parse@num@minus\csname lst@um-\endcsname]%
}
\makeatother
\lstnewenvironment{python}[1][]{%
\lstset{%
mathescape=false,%
language=python,%
basicstyle=\ttfamily\normalsize,%
otherkeywords={*,\{, \} },%
keywordstyle=\color{black},%
stringstyle=\color{black},%
showstringspaces=false,%
emph={class, pass, in, for, while, if, is, elif, else, not, and, or,%
def, print, exec, break, continue, return},%
emphstyle=\color{black}\bfseries,%
emph={[3]True, False, None, self},%
emphstyle=[2]\color{black!10},%
emph={[3]from, import, as},%
emphstyle=[3]\color{black},%
upquote=true,%
morecomment=[s]{"""}{"""},%
commentstyle=\color{gray}\slshape,%
aboveskip=12pt,belowskip=12pt,xleftmargin=-2pt,xrightmargin=3pt,framexleftmargin=20pt,framextopmargin=1pt,%
rulesepcolor=\color{gray},#1,
parsenumbers=true,
numbersstyle=\upshape
}}{}%
\begin{document}
\begin{python}
In [7]: np.searchsorted(X, 0.5)
Out[7]: 4998210 # This is 1 for test 1000
"""
Some text 1234
"""
\end{python}
\end{document}
BEARBEITEN:Das Problem, dass 0
es nicht in aufrechter Schrift angezeigt wird, liegt daran, dass und als eine Einheit listings
analysiert werden (da beide Codes haben0
,
Zifferoderandere). Der OutputOther
Hook versucht dann, es als Zahl zu analysieren 0,
, was fehlschlägt und daher nicht die erwartete Schriftart liefert.
Als Workaround können Sie dem Befehl folgende Zeile hinzufügen \lstset
:
literate={,}{{\char`\,}}{1}
welche Ausgänge
Dadurch bricht der Parser ab, bevor er das Komma liest. In diesem speziellen Fall sollte es keine Nebeneffekte geben, da Kommas nicht Teil von Schlüsselwörtern oder anderen speziellen Syntaxelementen sein sollten. Leider listings
erschwert dies die Verarbeitung neuer Syntaxelemente, sodass das Umgehen eines Problems hier oft ein anderes dort aufwirft.