Ist es möglich, die Zahlen immer in römischen Zahlen zu korrigieren, indem man eine Auflistung macht?

Ist es möglich, die Zahlen immer in römischen Zahlen zu korrigieren, indem man eine Auflistung macht?

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), romansiehe Screenshot:

Bildbeschreibung hier eingeben

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 OutputOtherHook 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
}

\lstsetAuß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 , numbersstylewird 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}

Bildbeschreibung hier eingeben


BEARBEITEN:Das Problem, dass 0es nicht in aufrechter Schrift angezeigt wird, liegt daran, dass und als eine Einheit listingsanalysiert werden (da beide Codes haben0,Zifferoderandere). Der OutputOtherHook 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

Bildbeschreibung hier eingeben

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 listingserschwert dies die Verarbeitung neuer Syntaxelemente, sodass das Umgehen eines Problems hier oft ein anderes dort aufwirft.

verwandte Informationen