![Reduza a fonte monoespaçada em ambientes personalizados (verbatim)](https://rvso.com/image/281583/Reduza%20a%20fonte%20monoespa%C3%A7ada%20em%20ambientes%20personalizados%20(verbatim).png)
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 cdblk
e codeblocks
. O codeblocks
ambiente é um verbatim
ambiente, mas cdblk
não é, mas preciso dos dois, pois por exemplo \textquotesingle
não é exibido corretamente na íntegra (é para isso que eu uso cdblk
).
Também defini uma \paper
chave no preâmbulo da versão em papel A4 do documento, enquanto nas versões para tablet defini uma \tablet
chave. 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 cdblk
e codeblock
os ambientes quando um tamanho de papel pequeno ( \iftablet{}
) for usado como no MWE abaixo.
Isto é o que tentei até agora, mas nenhum deles funciona:
Tentei usar o Adjustbox em ambientes
cdblk
ecodeblock
ambientes, mas me deparei com um erro.! Missing \endgroup inserted. <inserted text> \endgroup l.61 \begin{codeblock}
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*}{}
Tentei definir diferentes
cdblk
ambientes 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 cdblk
e codeblock
com 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}
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\font
controla a largura entre duas palavras. Deve ser definido para a largura de um caractere da fonte mono, por exemplo, o "1" como visto acima.
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 cdblk
nossos codeblock
ambientes.
Tudo o que tive que fazer foi substituir a definição cdblk
de e codeblock
por:
\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:
\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}