Mis etiquetas son las siguientes:
\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}
Está funcionando bien sin problemas. Confirme que necesito que arabic numerals (i.e., 0 to 9)
esté roman
siempre disponible; consulte la captura de pantalla:
¿Es esto posible arreglarlo? Por favor avise...
Respuesta1
Aquí hay una solución que hace uso del enfoque general de resaltado de números presentado enListados: números de color solo fuera de las palabras clave.
Necesitamos realizar algunos cambios en el OutputOther
enlace de esa solución, porque en este caso desea anular el estilo predeterminado sin importar si está en un comentario o no. El nuevo gancho se parece a:
\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
}
También a su \lstset
comando se le deben agregar las siguientes líneas:
parsenumbers=true,
numbersstyle=\upshape
Dondequiera que se analice un número listings
en la entrada, se numbersstyle
agrega al estilo actualmente activo.
Código de ejemplo completo:
\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}
EDITAR:El problema de que 0
no aparece en fuente vertical se debe al hecho de que listings
se analiza 0
y ,
como una unidad (ya que ambos tienen códigosdígitoootro). Luego, el OutputOther
gancho intenta analizarlo 0,
como un número que falla y, por lo tanto, no proporciona la fuente esperada.
Como solución alternativa, puede agregar la siguiente línea al \lstset
comando:
literate={,}{{\char`\,}}{1}
que salidas
Esto hace que el analizador se interrumpa antes de leer la coma. En este caso especial no debería haber efectos secundarios, porque las comas no deberían formar parte de palabras clave u otros elementos de sintaxis especiales. Desafortunadamente,listings
esto dificulta agregar el procesamiento de nuevos elementos de sintaxis, por lo que solucionar un problema aquí a menudo genera otro allí.