
Я использую \newcommand
для быстрого включения цифр. Но в сочетании с endfloat
, это выдает ошибку. Есть идеи, как отправить float в конец, когда включен таким образом?
\documentclass{article}
\usepackage{graphicx}
%\usepackage{endfloat} % this causes an error
\newcommand{\addfig}[1]{
\begin{figure}[htbp] % when float environment is included here
\centering
\includegraphics[width=\textwidth]{#1}
\end{figure}
}
\begin{document}
\addfig{fig1}
\end{document}
решение1
Хотя, насколько я могу судить, вы не можете настроить ее endfloat
для правильного распознавания команды \addfig
, вы можете настроить ее для распознавания дополнительных плавающих сред, таких как addfig
.
Например:
\documentclass{article}
\usepackage{graphicx}
\newenvironment{addfig}[1]{%
\begin{figure}
\centering
\includegraphics[width=\textwidth]{#1}
}{\end{figure}}
\usepackage{endfloat}
\DeclareDelayedFloatFlavor{addfig}{figure}
\begin{document}
\begin{addfig}{example-image-a}
\end{addfig}
\end{document}
решение2
Вот один из подходов, который записывает каждую цифру, используемую в форме команды, \addfig[<opts>]{<image>}
в файл tmpfig.tex
, а затем немедленно считывает этот файл:
\documentclass{article}
\usepackage{graphicx,newfile,endfloat}
\newoutputstream{tmpimg}
\newcommand{\addfig}[2][width=\textwidth]{%
\openoutputfile{tmpfig.tex}{tmpimg}% Open tmpfig.tex for (over)writing
% Add figure environment...
\addtostream{tmpimg}{\protect\begin{figure}[htbp]}
\addtostream{tmpimg}{\protect\centering}
\addtostream{tmpimg}{\protect\includegraphics[#1]{#2}}
\addtostream{tmpimg}{\protect\end{figure}}
\closeoutputstream{tmpimg}% Close tmpfig.tex
\input{tmpfig}% Input tmpfig.tex
}
\begin{document}
Some text.
\begin{figure}[htbp] % when float environment is included here
\centering
\includegraphics[width=\textwidth]{example-image-a}
\end{figure}
\addfig{example-image-b}
\addfig[width=.5\textwidth]{example-image-c}
\end{document}
решение3
И последнее, но не менее важное решение, которое пытается endfloat
как можно реже обновлять пакет:
\documentclass{article}
\usepackage{graphicx}
\usepackage{mwe}
\newcommand{\addfig}[1]{%
\begin{figure}[htbp] % when float environment is included here
\centering
\includegraphics[width=\textwidth]{#1}
\end{figure}
}
\usepackage{endfloat}[2011/12/25] % we need at least v2.5d
\usepackage{etoolbox}
% Adapt \addfig to the endfloat package
% First of all we make \addfig known to the endfloat package as variant of the figure environment
\DeclareDelayedFloatFlavour{addfig}{figure}
\makeatletter
% Special variant of \efloat@xfloat for commands (instead of environments):
% This macro will be expanded with every line read until \efloat@found@end is used.
% The original version tests if #2 (the actual line read) is "\end{}",
% and uses \efloat@iwrite in case of no and \efloat@found@end in case of yes.
% Our version just writes the line (containing the command and the rest of the line)
% using \efloat@iwrite and finishes the verbatim reading using \efloat@found@end afterwards.
{\catcode`\^^M=12 \endlinechar=-1 %
\long\gdef\my@efloat@xfloat#1#2^^M{%
\efloat@iwrite{#1}{#2}% write 1st line (containing the command)...
\efloat@found@end{#1}% ...and end verbatim reading afterwards
\next}} % process next line
% Since \addfig is a command and not an environment we need to start a group for our own
% using \begingroup, so it behaves like we would have written \begin{addfig}.
% (Note: The endfloat package is designed to work with environments, not with commands.)
% Additionally we patch \efloat@xfloat to use our own variant of it for this command.
\pretocmd\addfig{%
\begingroup
\let\efloat@xfloat\my@efloat@xfloat}{}{}
\makeatother
\begin{document}
\addfig{example-image}
\end{document}
Однако это решение имеет два недостатка:
Все, что написано в той же строке после использования команды, будет записано в файл, содержащий плавающие среды. Поэтому писать в одну строку невозможно,
\addfig{example-image} Some text...
так как в противном случае "Some text..." тоже будет задержано.Команда и ее аргументы должны быть записаны в одной строке. Поэтому невозможно разделить ее использование на несколько строк, например,
\addfig{%
как 1-ю иexample-image}
как 2-ю.
Всего мы используем здесь три внутренние команды \efloat@xfloat
: \efloat@iwrite
, , и \efloat@float@end
.
Приложение 2018-03-25
Начиная с endfloat v2.6 все становится немного проще, так как тест «является ли это последней строкой среды» теперь доступен как \efloat@if@end
, так что это единственная внутренняя команда, которую нам нужно исправить:
\documentclass{article}
\usepackage{graphicx}
\usepackage{mwe}
\newcommand{\addfig}[1]{%
\begin{figure}[htbp] % when float environment is included here
\centering
\includegraphics[width=\textwidth]{#1}
\end{figure}
}
\usepackage{endfloat}[2018/01/01] % we need at least v2.6
\usepackage{etoolbox}
% Adapt \addfig to the endfloat package
% First of all we make \addfig known to the endfloat package as variant of the figure environment
\DeclareDelayedFloatFlavour{addfig}{figure}
\makeatletter
% Since \addfig is a command and not an environment we need to start a group for our own
% using \begingroup, so it behaves like we would have written \begin{addfig}.
% (Note: The endfloat package is designed to work with environments, not with commands.)
% Additionally we patch \efloat@if@end (usually expanding to \@firstoftwo or \@secondoftwo)
% so the very first command line will be written to the file and the verbatim reading will be
% finished afterwards.
\newcommand\my@efloat@if@end[3]{#3#2}
\pretocmd\addfig{%
\begingroup
\let\efloat@if@end\my@efloat@if@end}{}{}
\makeatother
\begin{document}
\addfig{example-image}
\end{document}
решение4
Вот решение, основанное наОтвет Вернерано который полностью исключает использование endfloat
. Как только мы записываем цифры во внешний файл, в этом, похоже, нет особой необходимости, endfloat
поскольку мы можем просто прочитать цифры из файла в конце документа.
Он использует expl3
синтаксис, но это, по сути, так, между прочим. expl3
Он не даст вам ничего особенного — это просто альтернативный синтаксис.
Есть один макрос:
\addfig[<options>]{<filename>}{<caption>}
Очевидно, что необязательный аргумент предназначен для параметров, которые необходимо передать \includegraphics
, второй аргумент — для имени файла изображения, а третий — для подписи.
\documentclass{article}
\usepackage{graphicx,xparse,kantlipsum}
\ExplSyntaxOn
\AtBeginDocument
{
\iow_new:N \l_strongbad_addfigs_stream
\iow_open:Nn \l_strongbad_addfigs_stream { \jobname.addfigs }
}
\AtEndDocument
{
\iow_close:N \l_strongbad_addfigs_stream
\listoffigures
\file_input:n { \jobname.addfigs }
}
\cs_new_protected:Nn \strongbad_addfig:nnn
{
\group_begin:
\str_set:Nn \l_tmpa_str { \setcounter{figure} }
\str_put_right:Nx \l_tmpa_str { \c_left_brace_str }
\str_put_right:Nx \l_tmpa_str { \thefigure }
\str_put_right:Nx \l_tmpa_str { \c_right_brace_str }
\iow_now:Nx \l_strongbad_addfigs_stream { \l_tmpa_str }
\iow_now:Nn \l_strongbad_addfigs_stream
{
\begin{ figure }
\centering
\includegraphics [ #1 ] { #2 }
\caption { #3 }
\end{ figure }
}
\stepcounter{figure}
\skip_vertical:N \bigskipamount
\centering
[~\figurename{}~\thefigure{}~about~here~]
\skip_vertical:N \bigskipamount
\group_end:
}
\NewDocumentCommand \addfig { O {} m +m }
{
\strongbad_addfig:nnn { #1 } { #2 } { #3 }
}
\ExplSyntaxOff
\begin{document}
\kant[1]
\addfig{example-image-a}{first end figure}
\kant[2]
\addfig {example-image-b}{second end figure}
\kant[3]
\addfig [width=.25\textwidth] {tiger} {third end figure}
\kant[4-5]
\end{document}