在自訂(逐字)環境中縮小等寬字體

在自訂(逐字)環境中縮小等寬字體

我正在重新設計大學課程的講義,因為學生想在平板電腦、電子書閱讀器等上閱讀講義。

我在這些文件中有程式碼區塊,在cdblkcodeblocks環境中定義。環境codeblocks是一個verbatim環境,​​雖然cdblk不是,但我需要它們,因為例如\textquotesingle不能逐字正確顯示(這就是我使用cdblk的)。

\paper我還在文件的 A4 紙本版本的序言中定義了一個金鑰,而在平板電腦版本中我定義了一個\tablet金鑰。我還有兩個命令\ifpaper{}\iftablet{}分別用於紙張和平板電腦特定的 tex 代碼。

我想調整上面提到的字體大小cdblk和使用codeblock小紙張尺寸 ( \iftablet{}) 時的環境,如下面的 MWE 中所示。

這是我到目前為止所嘗試過的,但它們都不起作用:

  1. 我嘗試在周圍cdblkcodeblock環境中使用調整框,但遇到錯誤。

    ! Missing \endgroup inserted.
    <inserted text>
                    \endgroup
    l.61     \begin{codeblock}
    
  2. 我嘗試使用 設定等寬字體收縮microtype,但似乎沒有任何效果。 (包含在下面的 MWE 中。)

    \SetExpansion[shrink=100]{family=tt*}{}
    
  3. 我嘗試使用和cdblk為序言中的紙張和平板電腦版本定義不同的字體大小環境,但是當我編譯文件時,編譯器沒有註意到這些定義,因此它認為環境未定義。\ifpaper{}\iftablet{}

至少 72 個字元應該適合我使用的最小紙張尺寸(在 MWE 中使用)的環境cdblkcodeblock當然,裝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}

相關內容