
Editar: Ni siquiera te molestes en leer la pregunta. Simplemente salta directamente aLa respuesta de Heiko Oberdiek :)
Con el listings
paquete, composición tipográfica de listados en algunosabsolutoel tamaño de fuente es muy sencillo; todo lo que tienes que hacer, cuando defines tu estilo, es pasar, posiblemente junto con otras macros, una declaración de tamaño de fuente a la clave listings
' basicstyle
. Por ejemplo:
\lstdefinestyle{mystyle}{basicstyle=\ttfamily\color{blue}\scriptsize}
Eso está bien con el código mostrado ( lstlisting
entornos) y archivos independientes ( \lstinputlisting
). Sin embargo, rara vez quierescódigo en línea( \lstinline
) para ser tipografiado en eseabsolutotamaño de fuente. Por ejemplo, lo que sucede en el siguiente caso probablemente no sea lo que usted desea:
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset{basicstyle=\ttfamily\color{blue}\scriptsize}
\begin{document}
\Large
Here is a very important keyword: \lstinline|foo|.
\end{document}
Vaya... "foo" está escrito en \scriptsize
, a diferencia del texto circundante, que está escrito en \Large
. Aunque desea conservar la mayor parte del estilo (fuente de máquina de escribir y color azul, aquí), probablemente desee que el código en línea anule la especificación del tamaño de fuente y se escriba en el formatotamaño de fuente actual, ¿bien?
Ahora, si simplemente intentas pasar \fontsize{\f@size}{\f@baselineskip}
a basicstyle
, te llevarás una decepción:
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset{basicstyle=\ttfamily\color{blue}\scriptsize}
\begin{document}
\Large
Here is a very important keyword: \lstinline|foo|.
\makeatletter
Here is a very important keyword:
\lstinline[basicstyle=\fontsize{\f@size}{\f@baselineskip}\selectfont]|foo|.
\makeatother
\end{document}
Puedes sacar tu pañuelo: acabas de sobrescribir el estilo básico actual y, como resultado, ¡has perdido las especificaciones de fuente y color de la máquina de escribir! Por supuesto que podrías escribir
\lstinline%
[basicstyle=\ttfamily\color{blue}\fontsize{\f@size}{\f@baselineskip}\selectfont]%
|foo|
pero este enfoque supone que conoces la definición original de basicstyle
(que puede estar oculta en lo más profundo de un paquete, demasiado para los simples mortales) y es un ejemplo típico de duplicación de código que preferirías evitar.
Entonces se me ocurrió la siguiente solución, que funciona bien:
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\makeatletter
\newcommand\applyCurrentFontsize
{%
% we first save the current fontsize, baseline-skip,
% and listings' basicstyle
\let\f@sizeS@ved\f@size%
\let\f@baselineskipS@ved\f@baselineskip%
\let\basicstyleS@ved\lst@basicstyle%
% we now change the fontsize of listings' basicstyle
\renewcommand\lst@basicstyle%
{%
\basicstyleS@ved%
\fontsize{\f@sizeS@ved}{\f@baselineskipS@ved}%
\selectfont%
}%
}
\makeatother
\newcommand\scaledlstinline[2][]
{%
\bgroup%
\lstset{#1}%
\applyCurrentFontsize%
% ... possibly other macros whose effects should remain local ...
\lstinline|#2|%
\egroup%
}
\lstset{basicstyle=\ttfamily\color{blue}\scriptsize}
\begin{document}
\Large
Here is a very important keyword: \lstinline[]|foo|.
Here is a very important keyword: \scaledlstinline{foo}.
\end{document}
Hasta ahora, todo bien... Sin embargo, tengo problemas cuando intento adaptar esta táctica a \lstMakeShortInline
, una listings
macro que te permite definir un delimitador de un carácter para código en línea (he publicado las líneas relevantes a listings.dtx
continuación). Más específicamente, debido a la forma peculiar \lstMakeShortInline@
en que se utiliza \lst@shortinlinedef
, no puedo determinar dónde debo colocar mis comandos de agrupación.
Se agradecería cualquier orientación.
\newcommand\lstMakeShortInline[1][]{%
\def\lst@shortinlinedef{\lstinline[#1]}%
\lstMakeShortInline@}%
\def\lstMakeShortInline@#1{%
\expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
\lst@shortlstinlineinfo{Made }{#1}%
\lst@add@special{#1}%
% \end{macrocode}
% The character's current catcode is stored in
% |\lst@ShortInlineOldCatcode\|\meta{c}.
% \begin{macrocode}
\expandafter
\xdef\csname lst@ShortInlineOldCatcode\string#1\endcsname{\the\catcode`#1}%
% \end{macrocode}
% The character is spliced into the definition using the same trick as
% used in |\verb| (for instance), having activated |~| in a group.
% \begin{macrocode}
\begingroup
\catcode`\~\active \lccode`\~`#1%
\lowercase{%
% \end{macrocode}
% The character's old meaning is recorded
% in |\lst@ShortInlineOldMeaning\|\meta{c} prior to assigning it a new one.
% \begin{macrocode}
\global\expandafter\let
\csname lst@ShortInlineOldMeaning\string#1\endcsname~%
\expandafter\gdef\expandafter~\expandafter{\lst@shortinlinedef#1}}%
\endgroup
% \end{macrocode}
% Finally the character is made active.
% \begin{macrocode}
\global\catcode`#1\active
% \end{macrocode}
% If we suspect that \meta{c} is already a short reference, we tell
% the user. Now he or she is responsible if anything goes wrong\,\dots
% (Change in \packagename{listings}: We give a proper error here.)
% \begin{macrocode}
\else
\PackageError{Listings}%
{\string\lstMakeShorterInline\ definitions cannot be nested}%
{Use \string\lstDeleteShortInline first.}%
{}%
\fi}
Respuesta1
El paquete listings
también tiene ganchos TextStyle
o DisplayStyle
un interruptor \lst@ifdisplaystyle
, que puede usarse para su propósito de establecer un tamaño de fuente diferente en listados de códigos en línea y mostrados, por ejemplo:
\documentclass{article}
\usepackage{color}
\usepackage{listings}
\makeatletter
\lstdefinestyle{mystyle}{
basicstyle=%
\ttfamily
\color{blue}%
\lst@ifdisplaystyle\scriptsize\fi
}
\makeatother
\lstset{style=mystyle}
\begin{document}
\Large
\noindent
Here is a very important keyword: \lstinline|foo|.
\begin{lstlisting}
Some code with foo.
\end{lstlisting}
\end{document}
Respuesta2
La explicación de @HeikoOberdieksu respuestaLo anterior subestima su poder y, de hecho, basándose únicamente en su explicación, no pensaría que su respuesta resolvió completamente el problema del OP (como objetó un comentarista).
La afirmación de Heiko es sólo que proporcionó un método para "establecer un tamaño de fuente diferente en las listas de códigos en línea y mostrados". Pero lo que quería el OP era que \lstinline
heredara el tamaño de fuente del texto circundante. La solución de Heiko hace eso, aunque no quedará claro para los lectores que así es.
Por esa razón, solo quiero brindar un ejemplo que muestre que, efectivamente, con la solución de Heiko, el \lstinline
tamaño de la fuente aumenta y se reduce para ajustarse al texto circundante. (Si Heiko quisiera agregar un ejemplo similar a su respuesta, con gusto eliminaría este).
Agrego una \texttt{foo}
directamente después de cada una \lstinline|foo|
solo para facilitar la comparación de las alturas de las dos foo
s.
\documentclass{article}
\usepackage{color}
\usepackage{listings}
\makeatletter
\lstdefinestyle{mystyle}{
basicstyle=%
\ttfamily
\color{blue}%
\lst@ifdisplaystyle\footnotesize\fi
}
\makeatother
\lstset{style=mystyle}
\begin{document}
\title{Here is a title with \lstinline|foo| \texttt{foo}.}
\date{}
\maketitle
\section{Here is a section heading with \lstinline|foo| \texttt{foo}.}
\Large
Here is: \lstinline|foo| \texttt{foo}.\\
\Huge
Here is: \lstinline|foo| \texttt{foo}.\\
\begin{lstlisting}
Some code with foo.
\end{lstlisting}
\end{document}