renewenvironment 在前面有左括号,在后面有右括号(使宽浮动居中)

renewenvironment 在前面有左括号,在后面有右括号(使宽浮动居中)

抱歉,如果我缺乏 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在检查浮动内容之前执行最后一个命令。因此,每个figuretable环境都将使其内容居中。

另一方面,习惯并不那么困难

\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}

相关内容