我正在尝试将文档中所有表格内容的字体从衬线字体更改为无衬线字体。
具体来说,我需要一些可以应用于表格和表格*环境,这样字幕就不会改变。为了避免依赖,我正在寻找一种无需其他包即可实现的解决方案,并最终将其添加到样式文件中。
table
我当前的解决方案是像这样修改环境:
\makeatletter
\renewenvironment{table}
{\@float{table} \fontfamily{phv}\selectfont}
{\end@float}
\makeatother
在 MWE 中,它看起来像这样:
\documentclass[preview]{standalone}
\usepackage{setspace}
\usepackage{booktabs}
\makeatletter
\renewenvironment{table}
{\@float{table} \fontfamily{phv}\selectfont}
{\end@float}
\makeatother
\RequirePackage[format=plain,
labelformat=simple,
font={small,sf,bf},
indention=0cm,
labelsep=period,
justification=centering,
singlelinecheck=true,
tableposition=top,
figureposition=bottom]{caption}
\begin{document}
Blah blah. Should be a serif font.
\begin{table}[h]
\caption{Some caption, which should be bold.}
\label{tab:xxx}\centering
\begin{tabular}{ccc}
test1 & test2 & test3 \\
\toprule
test1 & test2 & test3 \\
test1 & test2 & test3 \\
test1 & test2 & test3 \\
\bottomrule
\end{tabular}
\end{table}
Blah blah. Should be a serif font.
\end{document}
一切正常,只是修改环境定义会导致 [h] 有点游动。
我究竟做错了什么?
答案1
问题
你得到浮动的原因[h]
是你的重新定义不接受参数。通常,你可以使用类似
\renewenvironment{table}[1][]
现在,事实上,这不是标准类在这种情况下处理可选参数的方式。article.cls
定义根本没有可选参数的环境:
\newenvironment{table}
{\@float{table}}
{\end@float}
\@float
那么为什么它会起作用呢? 它之所以有效是因为在中定义了方法latex.ltx
:
\def\@float#1{%
\@ifnextchar[%
{\@xfloat{#1}}%
{\edef\reserved@a{\noexpand\@xfloat{#1}[\csname fps@#1\endcsname]}%
\reserved@a}}
\@float
将{table}
作为第一个必需的参数,然后向前扫描以查看下一个标记是否为[
,如果是,它将处理的内容[...]
作为指定浮点数放置选项的参数。这依赖于[
输入流中的下一个内容。如果您更改定义以先执行其他操作:
\renewenvironment{table}
{\@float{table} \fontfamily{phv}\selectfont}
{\end@float}
那么下一个标记就不是[
,所以 LaTeX 假定在这种情况下没有可选参数,并将其余部分作为环境的内容处理。
如果你想要刚刚处理的可选参数,你可以将其扔掉
\renewenvironment{table}[1][]
但是,如果您希望可选参数照常处理,则必须将其传递给\@float{table}
因此必须前字体规范。
一个办法
您可以重新定义环境来处理该参数。但是,我建议修补环境,而不是覆盖它。这需要电子工具箱但该软件包使用非常广泛,许多文档都会加载它。我还建议不要对字体系列进行硬编码,而是使用文档的默认无衬线系列。
这是其中一种方法,但我不确定这是否是最好的方法。
\makeatletter
\newcommand*\my@starttable[1][]{%
\@float{table}[#1]\sffamily
}
\patchcmd{\table}{\@float{table}}{\my@starttable}{\PackageInfo{mysty}{Table environment patched successfully.}}{\PackageWarning{mysty}{Could not patch table environment.}}
\makeatother
mysty
当然,当将其放入文件时,应该将其替换为您的包的名称.sty
。
完整代码:
\documentclass{article}
\usepackage{setspace}
\usepackage{booktabs}
\usepackage{etoolbox}
\usepackage[format=plain,
labelformat=simple,
font={small,sf,bf},
indention=0cm,
labelsep=period,
justification=centering,
singlelinecheck=true,
tableposition=top,
figureposition=bottom]{caption}
\makeatletter
\newcommand*\my@starttable[1][]{%
\@float{table}[#1]\sffamily
}
\patchcmd{\table}{\@float{table}}{\my@starttable}{\PackageInfo{mysty}{Table environment patched successfully.}}{\PackageWarning{mysty}{Could not patch table environment.}}
\makeatother
\begin{document}
Blah blah. Should be a serif font.
\begin{table}[h]
\caption{Some caption, which should be bold.}
\label{tab:xxx}\centering
\begin{tabular}{ccc}
test1 & test2 & test3 \\
\toprule
test1 & test2 & test3 \\
test1 & test2 & test3 \\
test1 & test2 & test3 \\
\bottomrule
\end{tabular}
\end{table}
Blah blah. Should be a serif font.
\end{document}
答案2
使用内核提供的“reset”钩子会更容易:
\documentclass{article}
\usepackage{booktabs}
\usepackage{etoolbox}
\usepackage[format=plain,
labelformat=simple,
font={small,sf,bf},
indention=0cm,
labelsep=period,
justification=centering,
singlelinecheck=true,
tableposition=top,
figureposition=bottom]{caption}
\makeatletter
\appto\@floatboxreset{%
\ifx\@captype\andy@table
\sffamily
\fi
}
\def\andy@table{table}
\makeatother
\begin{document}
Blah blah. Should be a serif font.
\begin{table}[htp]
\caption{Some caption, which should be bold.}
\label{tab:xxx}\centering
\begin{tabular}{ccc}
test1 & test2 & test3 \\
\toprule
test1 & test2 & test3 \\
test1 & test2 & test3 \\
test1 & test2 & test3 \\
\bottomrule
\end{tabular}
\end{table}
Blah blah. Should be a serif font.
\end{document}
在对浮点数中的任何文本进行排版之前,LaTeX 会调用\@xfloatreset
,通常会这样做\reset@font\normalsize\@setminipage
,但可以添加任何所需的内容。在这种情况下,我们将\@captype
(本质上保存了被调用浮点数的名称)与固定字符串进行比较。因此,如果浮点数是表格,\sffamily
则会调用 。
看似更容易
\AtBeginEnvironment{table}{\sffamily}
无法工作,正是因为\@xfloatreset
问题\normalfont
。
答案3
tabular
如果您的环境中只有环境table
,那么您可以重新定义\tabular
:
\documentclass{article}
\usepackage{booktabs}
\usepackage[format=plain,
labelformat=simple,
font={small,sf,bf},
indention=0cm,
labelsep=period,
justification=centering,
singlelinecheck=true,
tableposition=top,
figureposition=bottom]{caption}
\let\Tabular\tabular
\def\tabular{\sffamily\Tabular}
\begin{document}
Blah blah. Should be a serif font.
\begin{table}[htp]
\caption{Some caption, which should be bold.}
\label{tab:xxx}\centering
\begin{tabular}{ccc}
test1 & test2 & test3 \\
\toprule
test1 & test2 & test3 \\
test1 & test2 & test3 \\
test1 & test2 & test3 \\
\bottomrule
\end{tabular}
\end{table}
Blah blah. Should be a serif font.
\end{document}
答案4
而不是跑步
\fontfamily{phv}\selectfont
\@float{table}
在重新定义环境之后table
,我建议你执行
\renewcommand\familydefault\sfdefault\selectfont
前 \@float{table}
。这样,代码就不会干扰 的操作\@float
(以及其对 等放置选项的处理h
)。
另外,我建议您执行该指令
\usepackage[scaled=0.83]{helvet}
在序言中将 Helvetica 设为默认的无衬线字体,同时缩放字体,使其 x 高度与文档的衬线字体的高度相匹配。
通过这些更改,您的代码将按预期执行,即h
正确处理了放置选项。
请注意,该解决方案自动应用于可能在环境中使用的所有类似表格的环境—— table
、、、、tabular
等。tabular*
tabularx
tabulary
\documentclass{article}
\usepackage{setspace,booktabs}
% Use Helvetica as the sans-serif font, and equalize the x-heights of
% the document's serif and sans-serif fonts.
\usepackage[scaled=0.83]{helvet}
\makeatletter
\renewenvironment{table}
{\renewcommand\familydefault\sfdefault\selectfont
\@float{table}}
{\end@float}
\makeatother
\RequirePackage[format=plain,
labelformat=simple,
font={small,bf}, % no need to specify 'sf' option
indention=0cm,
labelsep=period,
justification=centering,
singlelinecheck=true,
tableposition=top,
figureposition=bottom]{caption}
\begin{document}
Blah blah. Should be a serif font.
\begin{table}[h]
\caption{Some caption, which should be bold}
\label{tab:xxx}
\centering
\begin{tabular}{ccc}
\toprule
test1 & test2 & test3 \\
\midrule
test1 & test2 & test3 \\
test1 & test2 & test3 \\
test1 & test2 & test3 \\
\bottomrule
\end{tabular}
\end{table}
Blah blah. Should be a serif font.
\end{document}