![在自訂(逐字)環境中縮小等寬字體](https://rvso.com/image/281583/%E5%9C%A8%E8%87%AA%E8%A8%82%EF%BC%88%E9%80%90%E5%AD%97%EF%BC%89%E7%92%B0%E5%A2%83%E4%B8%AD%E7%B8%AE%E5%B0%8F%E7%AD%89%E5%AF%AC%E5%AD%97%E9%AB%94.png)
我正在重新設計大學課程的講義,因為學生想在平板電腦、電子書閱讀器等上閱讀講義。
我在這些文件中有程式碼區塊,在cdblk
和codeblocks
環境中定義。環境codeblocks
是一個verbatim
環境,雖然cdblk
不是,但我需要它們,因為例如\textquotesingle
不能逐字正確顯示(這就是我使用cdblk
的)。
\paper
我還在文件的 A4 紙本版本的序言中定義了一個金鑰,而在平板電腦版本中我定義了一個\tablet
金鑰。我還有兩個命令\ifpaper{}
,\iftablet{}
分別用於紙張和平板電腦特定的 tex 代碼。
我想調整上面提到的字體大小cdblk
和使用codeblock
小紙張尺寸 ( \iftablet{}
) 時的環境,如下面的 MWE 中所示。
這是我到目前為止所嘗試過的,但它們都不起作用:
我嘗試在周圍
cdblk
和codeblock
環境中使用調整框,但遇到錯誤。! Missing \endgroup inserted. <inserted text> \endgroup l.61 \begin{codeblock}
我嘗試使用 設定等寬字體收縮
microtype
,但似乎沒有任何效果。 (包含在下面的 MWE 中。)\SetExpansion[shrink=100]{family=tt*}{}
我嘗試使用和
cdblk
為序言中的紙張和平板電腦版本定義不同的字體大小環境,但是當我編譯文件時,編譯器沒有註意到這些定義,因此它認為環境未定義。\ifpaper{}
\iftablet{}
至少 72 個字元應該適合我使用的最小紙張尺寸(在 MWE 中使用)的環境cdblk
。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 個字元適合cdblk
或codeblock
環境。
我所要做的就是將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}