抱歉,如果我缺乏 tex 和宏定义的基础知识,我才刚刚开始接触它。
我的具体问题是如何获得LaTeX 中图形的自定义边距,特别是如何中心图形的宽度大于 \textwidth. 但我希望定义此设置在宏中。
因此,这就是我问一个关于宏语法的更一般的问题的原因:如何将环境的内容嵌套在命令中?我以为我只需要替换{ ... }
为\bgroup ... \egroup
我尝试调整“makebox
“ 方法失败\renewenvironment
了:
\let\origfig=\figure
\let\endorigfig=\endfigure
\renewenvironment{figure}[1][]{%
\origfig
\noindent\makebox[\textwidth]\bgroup\centering
}{
\egroup\endorigfig
}
抛出
! Missing } inserted.
<inserted text>
}
PS:对于这个特定的浮动宽度问题,我会很乐意使用可以完成这项工作的包,例如floatrow
(但我还没有设法产生所需的结果)。
PPS:我也想用这种方式重新定义表环境。
编辑。我根据@egreg 的回答添加了一个最小示例:
\documentclass{article}
% Install package "mwe" to get the example image.
\usepackage{graphicx}
% From: https://tex.stackexchange.com/a/541576
\makeatletter
\expandafter\def\expandafter\@floatboxreset\expandafter{\@floatboxreset\centering}
\makeatother
\begin{document}
% To visualise the text margins:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
\begin{figure}[h]
\includegraphics[width=1.2\linewidth, height=0.1\textheight]{example-image-a.png}
\end{figure}
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
\end{document}
答案1
您不想这样做,而是要将浮动机制本身钩住。
目前没有用户界面,因此您需要一些低级代码:
\makeatletter
\expandafter\def\expandafter\@floatboxreset\expandafter{\@floatboxreset\centering}
\makeatother
文档前言中的这段代码将使 LaTeX\centering
在检查浮动内容之前执行最后一个命令。因此,每个figure
和table
环境都将使其内容居中。
另一方面,习惯并不那么困难
\begin{figure}[htp]
\centering
并忘记这个问题。
答案2
egreg 已经展示了如何添加居中,但要回答您关于的问题\bgroup
。
在如下定义之后
\newcommand\zzz[1]{this (#1)}
然后,参数#1
必须是一个单独的标记或一个由显式{
和}
(或一般带有 catcode 1 和 2 的字符)包围的组。 \bgroup
由 so 定义,\let
它是一个隐式字符,可用于 tex 分组,但不能用于无界参数。
\zzz\bgroup zzz\egroup
#1
的参数\zzz
只是单个标记\bgroup
,因此它将扩展为
this (\bgroup)zzz\egroup
并排版为
> this ()zzz
在这种情况下,您不会得到任何错误,但会得到不想要的输出。一般来说,意外情况\bgroup
可能会因不匹配的组而产生任意低级错误,具体取决于命令的详细信息。
答案3
该类memoir
提供了centerfloat
使宽度大于的浮点居中显示的命令textwidth
。
尝试一下这个修改过的 MWE 版本。
% widefloatprob.tex SE 541571
\documentclass{article}
% Install package "mwe" to get the example image.
\usepackage{graphicx}
\makeatletter
\newcommand*{\centerfloat}{%
\parindent \z@
\leftskip \z@ \@plus 1fil \@minus \textwidth
\rightskip\leftskip
\parfillskip \z@skip}
\makeatother
\begin{document}
% To visualise the text margins:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
\begin{figure}[h]
\centerfloat
\includegraphics[width=1.2\linewidth, height=0.1\textheight]{example-image-a.png}
\end{figure}
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
\end{document}
可以\centerfloat
用于任何具有已知宽度的浮点数,例如tabular
(表格)。
答案4
由于该\makebox
方法需要图形作为参数,因此您可以将图形名称解析为新环境的参数:
\documentclass{article}
\usepackage{graphics}
\usepackage{mwe} %examplary figure "example-image-a"
\usepackage{blindtext} %examplary text "\blindtext"
\begin{document}
%definitions of the new environment "fig"
\newenvironment{fig}[2][\textwidth]
{\begin{figure}[htbp]\makebox[\textwidth][c]{\includegraphics[width=#1,height=1cm]{#2}}}
{\end{figure}}
%example
\begin{fig}[1.2\textwidth]{example-image-a}
\caption{Caption}
\label{fig:key}
\end{fig}
\blindtext
\end{document}
或者你也可以定义一个新命令:
\newcommand{\includegraphicsCenter}[2][]{\makebox[\textwidth][c]{\includegraphics[#1]{#2}}}
\begin{figure}[htbp]
\includegraphicsCenter[width=1.2\textwidth,height=1cm]{example-image-a}
\caption{Caption}
\label{fig:key2}
\end{figure}