在自定义(逐字)环境中缩小等宽字体

在自定义(逐字)环境中缩小等宽字体

我正在重新设计大学课程的讲义,因为学生们想在平板电脑、电子书阅读器等设备上阅读笔记。

我在这些文档中定义了代码块,它们在cdblkcodeblocks环境中定义。codeblocks环境是verbatim环境,而cdblk不是,但我需要它们两者,因为例如\textquotesingle无法逐字正确显示(这就是我使用cdblk的)。

\paper我还在文档的 A4 纸版前言中定义了一个键,而在平板电脑版中,我定义了一个\tablet键。我还有两个命令\ifpaper{}\iftablet{}针对纸张和平板电脑的特定 tex 代码。

我想调整上面提到的字体大小cdblk以及使用codeblock小纸张尺寸(\iftablet{})的环境,就像下面的 MWE 一样。

这是我到目前为止尝试过的方法,但都不起作用:

  1. 我曾尝试在周围环境中使用 adjustbox cdblkcodeblock但遇到了错误。

    ! Missing \endgroup inserted.
    <inserted text>
                    \endgroup
    l.61     \begin{codeblock}
    
  2. 我尝试使用 设置等宽字体缩小microtype,但似乎没有任何效果。(包含在下面的 MWE 中。)

    \SetExpansion[shrink=100]{family=tt*}{}
    
  3. 我尝试cdblk在序言中使用\ifpaper{}和为纸质版本和平板电脑版本定义不同的字体大小环境\iftablet{},但是当我编译文档时,编译器没有注意到这些定义,因此它认为环境未定义。

cdblk我使用的最小纸张尺寸(用于 MWE)的和环境中至少应该可以容纳 72 个字符codeblock。当然,容纳 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两个单词之间的宽度。必须将其设置为单色字体的一个字符的宽度,例如上面的“1”。

在此处输入图片描述

答案3

我正在添加 egreg 指出的答案(列表字体大小适合 80 列吗?)。我喜欢这个功能,因为它会根据页面大小选择字体大小(更准确地说是\textwidth),因此我可以将它用于我使用的所有纸张尺寸,从而使 80 个字符适合cdblkcodeblock环境。

我所要做的就是将cdblkcodeblock的定义替换为:

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

相关内容