![Уменьшить моноширинный шрифт в пользовательских (дословных) средах](https://rvso.com/image/281583/%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D1%82%D1%8C%20%D0%BC%D0%BE%D0%BD%D0%BE%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%88%D1%80%D0%B8%D1%84%D1%82%20%D0%B2%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D1%85%20(%D0%B4%D0%BE%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D1%8B%D1%85)%20%D1%81%D1%80%D0%B5%D0%B4%D0%B0%D1%85.png)
Я переделываю конспекты лекций для университетского курса, так как студенты хотели читать их на своих планшетах, электронных книгах и т. д.
У меня есть блоки кода в этих документах, определенные в cdblk
и codeblocks
окружениях. codeblocks
Окружение является verbatim
окружением, а cdblk
не является, но мне нужны оба, так как например \textquotesingle
не отображается правильно в дословном виде (именно для этого я и использую cdblk
).
Я также определил \paper
ключ в преамбуле бумажной версии документа формата А4, а в планшетных версиях я определил ключ \tablet
. У меня также есть две команды \ifpaper{}
и \iftablet{}
для бумажной и планшетной версии специфический tex-код.
Я хотел бы настроить размер шрифта, как указано выше, cdblk
и codeblock
среду, когда используется небольшой размер бумаги ( \iftablet{}
), как в MWE ниже.
Вот что я пробовал до сих пор, но ни один из них не сработал:
Я пытался использовать Adjustbox вокруг
cdblk
иcodeblock
в средах, но столкнулся с ошибкой.! Missing \endgroup inserted. <inserted text> \endgroup l.61 \begin{codeblock}
Я пробовал задать уменьшение моноширинного шрифта с помощью
microtype
, но, похоже, это не дало никакого эффекта. (Включено в MWE ниже.)\SetExpansion[shrink=100]{family=tt*}{}
Я пытался определить различные
cdblk
среды размеров шрифта для бумажной и планшетной версий в преамбуле с помощью\ifpaper{}
и\iftablet{}
, но когда я компилирую документ, компилятор не замечает эти определения, поэтому он думает, что среда не определена.
По крайней мере 72 символа должны поместиться в cdblk
и codeblock
средах с наименьшим размером бумаги, который я использую (используется в MWE). Конечно, размещение 80 символов было бы лучше, но мне нужно как минимум 72.
Вот пример минимального рабочего примера:
\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}
решение1
Одним из возможных способов сделать это было бы создание нового условного оператора, а затем добавление переключателя размера шрифта в ключ настроек вашего файла 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}
решение2
\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}
Управляет \fontdimen2\font
шириной между двумя словами. Она должна быть установлена на ширину символа шрифта mono, например, "1", как показано выше.
решение3
Я добавляю ответ, на который мне указал egreg (размер шрифта объявлений, который помещается в 80 столбцов?). Мне это нравится, потому что он выбирает размер шрифта в соответствии с размером страницы (точнее, \textwidth
), поэтому я могу использовать его со всеми размерами бумаги, с которыми работаю, в результате чего 80 символов поместятся в cdblk
любом codeblock
месте.
Все, что мне нужно было сделать, это заменить определения cdblk
's и codeblock
' на:
\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}}
}
Полностью рабочий пример:
\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}