カスタム(逐語的)環境で等幅フォントを縮小する

カスタム(逐語的)環境で等幅フォントを縮小する

学生がタブレットや電子書籍リーダーなどでノートを読みたいと希望したため、大学の授業の講義ノートを再設計しています。

cdblkこれらのドキュメントには、および環境で定義されたコード ブロックがありますcodeblockscodeblocks環境は環境ですverbatimが、は環境cdblkではありません。ただし、たとえば は\textquotesingleverbatim (私が使用したもの) では正しく表示されないため、両方が必要ですcdblk

\paperまた、A4 用紙バージョンのドキュメントのプリアンブルにキーを定義し、タブレット バージョンではキーを定義しました。また、紙とタブレット固有の TEX コード用に\tablet2 つのコマンドがあります。\ifpaper{}\iftablet{}

下記のMWEのように小さい用紙サイズ( )を使用する場合は、上記のフォントサイズcdblkと環境を調整したいと思います。codeblock\iftablet{}

これまで試したことは次のとおりですが、どちらも機能しません。

  1. cdblk周囲や環境で調整ボックスを使用しようとしましたcodeblockが、エラーが発生しました。

    ! Missing \endgroup inserted.
    <inserted text>
                    \endgroup
    l.61     \begin{codeblock}
    
  2. で等幅フォントの縮小を設定してみましたmicrotypeが、効果がないようです。(以下の MWE に含まれています。)

    \SetExpansion[shrink=100]{family=tt*}{}
    
  3. cdblkと を使用して、プリアンブルで紙バージョンとタブレット バージョンに異なるフォント サイズ環境を定義しようとしました\ifpaper{}\iftablet{}、ドキュメントをコンパイルするときにコンパイラはそれらの定義に気付かないため、環境が定義されていないと認識します。

私が使用している最小の用紙サイズ (MWE で使用) では、少なくとも 72 文字が および 環境に収まるはずですcdblk。もちろん、80 文字が収まる方が望ましいですが、少なくとも 72 文字は必要です。codeblock

以下に最小限の動作例を示します。

\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

これを行う 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}

2 つの単語間の幅を制御\fontdimen2\fontします。モノ フォントの文字の幅 (上記の「1」など) に設定する必要があります。

ここに画像の説明を入力してください

答え3

egreg が教えてくれた答えを追加します (80 列に適合するリストのフォント サイズは?)。ページ サイズに応じてフォント サイズが選択されるため (より正確には まで)、使用するすべての用紙サイズでこれを使用でき、結果としてまたは環境\textwidthに 80 文字が収まるため、この機能が気に入っています。cdblkcodeblock

私がしなければならなかったのはcdblk、 と の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}

関連情報