Reduza a fonte monoespaçada em ambientes personalizados (verbatim)

Reduza a fonte monoespaçada em ambientes personalizados (verbatim)

Estou redesenhando notas de aula para uma aula universitária, pois os alunos queriam ler as notas em seus tablets, leitores de e-books, etc.

Tenho blocos de código nesses documentos, definidos nos ambientes cdblke codeblocks. O codeblocksambiente é um verbatimambiente, mas cdblknão é, mas preciso dos dois, pois por exemplo \textquotesinglenão é exibido corretamente na íntegra (é para isso que eu uso cdblk).

Também defini uma \paperchave no preâmbulo da versão em papel A4 do documento, enquanto nas versões para tablet defini uma \tabletchave. Eu também tenho dois comandos \ifpaper{}e \iftablet{}para código tex específico para papel e tablet.

Gostaria de ajustar o tamanho da fonte mencionado acima cdblke codeblockos ambientes quando um tamanho de papel pequeno ( \iftablet{}) for usado como no MWE abaixo.

Isto é o que tentei até agora, mas nenhum deles funciona:

  1. Tentei usar o Adjustbox em ambientes cdblke codeblockambientes, mas me deparei com um erro.

    ! Missing \endgroup inserted.
    <inserted text>
                    \endgroup
    l.61     \begin{codeblock}
    
  2. Tentei definir a redução da fonte monoespaçada com microtype, mas não parece ter nenhum efeito. (Incluído no MWE abaixo.)

    \SetExpansion[shrink=100]{family=tt*}{}
    
  3. Tentei definir diferentes cdblkambientes de tamanho de fonte para as versões em papel e tablet no preâmbulo usando \ifpaper{}e \iftablet{}, mas quando compilo o documento o compilador não percebe essas definições, então pensa que o ambiente não está definido.

Devem caber pelo menos 72 caracteres nos ambientes cdblke codeblockcom o menor tamanho de papel que utilizo (usado no MWE). Claro, caber 80 caracteres seria melhor, mas preciso de pelo menos 72.

Aqui está o exemplo de trabalho mínimo:

\documentclass[10pt, titlepage]{article}

%\def\paper{1}
\def\tablet{1}

\usepackage[nohead,%
    nofoot,%
    nomarginpar,%
    paperwidth=106.68mm,%
    paperheight=142.24mm,%
    tmargin=2.5mm,%
    rmargin=2.5mm,%
    bmargin=2.5mm,%
    lmargin=2.5mm,
    vscale=1,%
    hscale=1]{geometry}
%\usepackage[a4paper]{geometry}
%\usepackage[headings]{fullpage}

\newcommand{\ifpaper}[1]{\ifx\paper\undefined\else{#1}\fi}
\newcommand{\iftablet}[1]{\ifx\tablet\undefined\else{#1}\fi}

\usepackage[cmyk, pdftex]{xcolor}

\definecolor{PMS420}{cmyk}{0, 0, 0, 0.15}

\usepackage[protrusion=true,%
    expansion=true]{microtype}

\SetExpansion[shrink=100]{family=tt*}{}

\usepackage{verbatim}

\usepackage[framemethod=tikz,%
    innerleftmargin=\parindent,%
    skipabove=0.4\baselineskip,%
    skipbelow=0.4\baselineskip,%
    innertopmargin=0.4\baselineskip,%
    innerbottommargin=0.4\baselineskip]{mdframed}

\newmdenv[linewidth=0pt,%
    linecolor=PMS420,%
    backgroundcolor=PMS420,%
    settings={\setlength{\parindent}{0pt}}]{cdblk}
\newenvironment{codeblock}{\endgraf\verbatim}{\endverbatim}
\BeforeBeginEnvironment{codeblock}{\begin{cdblk}}
\AfterEndEnvironment{codeblock}{\end{cdblk}}

\pagestyle{empty}

\begin{document}

\begin{cdblk}
\verb+80 characters should                      fit in                        one line+
\end{cdblk}

\begin{codeblock}
80 characters should                      fit in                        one line
\end{codeblock}

\end{document}

Responder1

Uma maneira possível de fazer isso seria criar uma nova condicional e, em seguida, adicionar uma opção de tamanho de fonte à chave de configurações do seu arquivo newmdenv.

\newif\ifsmall
\smalltrue    % we want small sizes
%\smallfalse  % uncomment to turn off small sizes
\newmdenv[linewidth=0pt, linecolor=PMS420, backgroundcolor=PMS420,%
    settings={\ifsmall\fontsize{6pt}{7pt}\selectfont\fi\setlength{\parindent}{0pt}}]{cdblk}

insira a descrição da imagem aqui

Responder2

\documentclass[10pt, titlepage]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{microtype}

\newcommand*\verbfont{%
  \fontfamily{lmtt}\fontseries{lc}\fontshape{n}\selectfont%
  \SetTracking{encoding=*}{-50}\lsstyle}
%\def\paper{1}
\def\tablet{1}

\usepackage[nohead,%
    nofoot,%
    nomarginpar,%
    paperwidth=106.68mm,%
    paperheight=142.24mm,%
    tmargin=2.5mm,%
    rmargin=2.5mm,%
    bmargin=2.5mm,%
    lmargin=2.5mm,
    vscale=1,%
    hscale=1]{geometry}
%\usepackage[a4paper]{geometry}
%\usepackage[headings]{fullpage}

\newcommand{\ifpaper}[1]{\ifx\paper\undefined\else{#1}\fi}
\newcommand{\iftablet}[1]{\ifx\tablet\undefined\else{#1}\fi}

\usepackage[cmyk, pdftex]{xcolor}
\definecolor{PMS420}{cmyk}{0, 0, 0, 0.15}

\usepackage{verbatim}
\makeatletter
\def\verbatim@font{\verbfont\setbox0=\hbox{1}\fontdimen2\font=\the\wd0}
\makeatother

\usepackage[framemethod=tikz,%
    innerleftmargin=\parindent,%
    skipabove=0.4\baselineskip,%
    skipbelow=0.4\baselineskip,%
    innertopmargin=0.4\baselineskip,%
    innerbottommargin=0.4\baselineskip]{mdframed}
\newmdenv[linewidth=0pt,%
    linecolor=PMS420,%
    backgroundcolor=PMS420,%
    settings={\setlength{\parindent}{0pt}}]{cdblk}
\newenvironment{codeblock}{\endgraf\verbatim}{\endverbatim}
\BeforeBeginEnvironment{codeblock}{\begin{cdblk}}
\AfterEndEnvironment{codeblock}{\end{cdblk}}
\pagestyle{empty}
\begin{document}

\begin{cdblk}
\verb+80 characters should                      fit in                        one line+
\end{cdblk}

\begin{codeblock}
80 characters should                      fit in                        one line
01234567890123456789012345678901234567890123456789012345678901234567890123456789
\end{codeblock}

{\verbfont
01234567890123456789012345678901234567890123456789012345678901234567890123456789}

\ttfamily
01234567890123456789012345678901234567890123456789012345678901234567890123456789
\end{document}

O \fontdimen2\fontcontrola a largura entre duas palavras. Deve ser definido para a largura de um caractere da fonte mono, por exemplo, o "1" como visto acima.

insira a descrição da imagem aqui

Responder3

Estou adicionando a resposta que egreg me apontou (tamanho da fonte das listagens que cabe em 80 colunas?). Gosto disso porque ele selecionará o tamanho da fonte de acordo com o tamanho da página (mais precisamente \textwidth), para que eu possa usar isso com todos os tamanhos de papel com os quais trabalho, resultando em 80 caracteres que cabem em cdblknossos codeblockambientes.

Tudo o que tive que fazer foi substituir a definição cdblkde e codeblockpor:

\newlength{\eightytt}

\newcommand{\testthewidth}{%
    \fontsize{\dimen0}{0}\selectfont%
    \sbox0{x\global\dimen1=0.6em}%
    \ifdim 73\dimen1>\textwidth%
        \advance\dimen0 by -.1pt%
        \expandafter\testthewidth%
    \else%
        \global\eightytt\dimen0%
    \fi%
}

\AtBeginDocument{%
    \dimen0=\csname f@size\endcsname pt%
    \begingroup%
    \ttfamily%
    \testthewidth%
    \endgroup%
    \newmdenv[font=\fontsize{\eightytt}{1.2\eightytt}\ttfamily,%
        linewidth=0pt,%
        linecolor=PMS420,%
        backgroundcolor=PMS420,%
        settings={\setlength{\parindent}{0pt}}]{cdblk}
        \newenvironment{codeblock}{\endgraf\verbatim}{\endverbatim}
        \BeforeBeginEnvironment{codeblock}{\begin{cdblk}}
        \AfterEndEnvironment{codeblock}{\end{cdblk}}
}

Exemplo totalmente funcional:

responder

\documentclass[10pt, titlepage]{article}

%\def\paper{1}
\def\tablet{1}

\usepackage[nohead,%
    nofoot,%
    nomarginpar,%
    paperwidth=106.68mm,%
    paperheight=142.24mm,%
    tmargin=2.5mm,%
    rmargin=2.5mm,%
    bmargin=2.5mm,%
    lmargin=2.5mm,
    vscale=1,%
    hscale=1]{geometry}
%\usepackage[a4paper]{geometry}
%\usepackage[headings]{fullpage}

\newcommand{\ifpaper}[1]{\ifx\paper\undefined\else{#1}\fi}
\newcommand{\iftablet}[1]{\ifx\tablet\undefined\else{#1}\fi}

\usepackage[cmyk, pdftex]{xcolor}

\definecolor{PMS420}{cmyk}{0, 0, 0, 0.15}

\usepackage[protrusion=true,%
    expansion=true]{microtype}

\SetExpansion[shrink=100]{family=tt*}{}

\usepackage{verbatim}

\usepackage[framemethod=tikz,%
    innerleftmargin=\parindent,%
    skipabove=0.4\baselineskip,%
    skipbelow=0.4\baselineskip,%
    innertopmargin=0.4\baselineskip,%
    innerbottommargin=0.4\baselineskip]{mdframed}

\pagestyle{empty}

% egreg's solution:
\newlength{\eightytt}

\newcommand{\testthewidth}{%
    \fontsize{\dimen0}{0}\selectfont%
    \sbox0{x\global\dimen1=0.6em}%
    \ifdim 73\dimen1>\textwidth%
        \advance\dimen0 by -.1pt%
        \expandafter\testthewidth%
    \else%
        \global\eightytt\dimen0%
    \fi%
}

\AtBeginDocument{%
    \dimen0=\csname f@size\endcsname pt%
    \begingroup%
    \ttfamily%
    \testthewidth%
    \endgroup%
    \newmdenv[font=\fontsize{\eightytt}{1.2\eightytt}\ttfamily,%
        linewidth=0pt,%
        linecolor=PMS420,%
        backgroundcolor=PMS420,%
        settings={\setlength{\parindent}{0pt}}]{cdblk}
        \newenvironment{codeblock}{\endgraf\verbatim}{\endverbatim}
        \BeforeBeginEnvironment{codeblock}{\begin{cdblk}}
        \AfterEndEnvironment{codeblock}{\end{cdblk}}
}

\begin{document}

\begin{cdblk}
\verb+80 characters should                      fit in                        one line+
\end{cdblk}

\begin{codeblock}
80 characters should                      fit in                        one line
\end{codeblock}

\end{document}

informação relacionada