Dimensionando o código embutido para o tamanho da fonte atual

Dimensionando o código embutido para o tamanho da fonte atual

Editar: Nem se preocupe em ler a pergunta. Basta pular direto paraA resposta de Heiko Oberdiek :)

Com o listingspacote, a composição de listagens em algunsabsolutoo tamanho da fonte é muito fácil; tudo o que você precisa fazer, ao definir seu estilo, é passar, possivelmente junto com outras macros, uma declaração de tamanho de fonte para a tecla listings' basicstyle. Por exemplo:

\lstdefinestyle{mystyle}{basicstyle=\ttfamily\color{blue}\scriptsize}

Tudo bem com código exibido ( lstlistingambientes) e arquivos independentes ( \lstinputlisting). No entanto, você raramente quercódigo embutido( \lstinline) ser digitado naqueleabsolutotamanho da fonte. Por exemplo, o que acontece no seguinte caso provavelmente não é o que você deseja:

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

insira a descrição da imagem aqui

Ops... "foo" está escrito em \scriptsize, ao contrário do texto ao redor, que está escrito em \Large. Embora você queira manter a maior parte do estilo (fonte de máquina de escrever e cor azul, aqui), você provavelmente deseja que o código embutido substitua a especificação do tamanho da fonte e seja digitado no formatotamanho da fonte atual, certo?

Agora, se você simplesmente tentar passar \fontsize{\f@size}{\f@baselineskip}para basicstyle, ficará desapontado:

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

insira a descrição da imagem aqui

Você pode sacar seu lenço: você acabou de sobrescrever o estilo básico atual e, como resultado, perdeu a fonte da máquina de escrever e as especificações de cores! Você poderia, é claro, escrever

\lstinline%
[basicstyle=\ttfamily\color{blue}\fontsize{\f@size}{\f@baselineskip}\selectfont]%
|foo|

mas essa abordagem pressupõe que você conheça a definição original de basicstyle(que pode estar enterrada profundamente dentro de um pacote, muito fundo para meros mortais) e é um exemplo típico de duplicação de código que você prefere evitar.

Então, criei a seguinte solução alternativa, que funciona bem:

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

insira a descrição da imagem aqui

Até agora, tudo bem... No entanto, tenho problemas quando tento adaptar essa tática para \lstMakeShortInline, uma listingsmacro que permite definir um delimitador de um caractere para código embutido (postei as linhas relevantes abaixo listings.dtx). Mais especificamente, devido à forma peculiar \lstMakeShortInline@de uso \lst@shortinlinedef, não consigo descobrir onde devo colocar meus comandos de agrupamento.

Qualquer orientação seria apreciada.

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

Responder1

O pacote listingstambém possui ganchos TextStylee DisplayStyle/ou um switch \lst@ifdisplaystyle, que pode ser usado para definir um tamanho de fonte diferente em listagens de código in-line e exibidas, por exemplo:

\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

Responder2

A explicação de @HeikoOberdiek paraa resposta deleacima subestima seu poder e, de fato, com base apenas em sua explicação, você não pensaria que sua resposta resolvesse totalmente o problema do OP (como objetou um comentarista).

A afirmação de Heiko é apenas que ele forneceu um método para "definir um tamanho de fonte diferente nas listagens de código embutidas e exibidas". Mas o que o OP queria era \lstinlineherdar o tamanho da fonte do texto ao redor. A solução da Heiko faz isso, embora não fique claro para os leitores que sim.

Por esse motivo, quero apenas dar um exemplo que mostra que, de fato, com a solução da Heiko, o \lstinlinetamanho da fonte aumenta e diminui para se ajustar ao texto ao redor. (Se Heiko quiser adicionar um exemplo semelhante à sua resposta, eu excluiria este com prazer.)

Eu adiciono um \texttt{foo}logo após cada um \lstinline|foo|apenas para facilitar a comparação das alturas dos dois foo.

insira a descrição da imagem aqui

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

informação relacionada