
Editar: Nem se preocupe em ler a pergunta. Basta pular direto paraA resposta de Heiko Oberdiek :)
Com o listings
pacote, 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 ( lstlisting
ambientes) 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}
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}
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}
Até agora, tudo bem... No entanto, tenho problemas quando tento adaptar essa tática para \lstMakeShortInline
, uma listings
macro 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 listings
também possui ganchos TextStyle
e 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}
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 \lstinline
herdar 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 \lstinline
tamanho 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
.
\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}