Escalar el código en línea al tamaño de fuente actual

Escalar el código en línea al tamaño de fuente actual

Editar: Ni siquiera te molestes en leer la pregunta. Simplemente salta directamente aLa respuesta de Heiko Oberdiek :)

Con el listingspaquete, 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 ( lstlistingentornos) 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}

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

Hasta ahora, todo bien... Sin embargo, tengo problemas cuando intento adaptar esta táctica a \lstMakeShortInline, una listingsmacro que te permite definir un delimitador de un carácter para código en línea (he publicado las líneas relevantes a listings.dtxcontinuació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 listingstambién tiene ganchos TextStyleo DisplayStyleun 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}

Resultado

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 \lstinlineheredara 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 \lstinlinetamañ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 foos.

ingrese la descripción de la imagen aquí

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

información relacionada