Как разместить текст в конце подписи?

Как разместить текст в конце подписи?

Я хотел бы разместить текст с информацией об авторских правах на изображение, которое в настоящее время находится в Списке иллюстраций, но, возможно, мне придется изменить его и разместить его (также) под каждым изображением.

Этот MWE работает отлично:

\documentclass{article}
\usepackage{graphicx}
\usepackage{caption}
\newcommand\after[1]{#1}
\newcommand\afterlof{; \after}
\newcommand\aftercap{ }%for optional use
\begin{document}
\begin{figure}[htb]
    \includegraphics[width=.5\textwidth]{example-image-a}
\def\after{the copyright for this image}
    \caption%
     [caption for LOF\afterlof]%
     {caption below the image\aftercap}
\end{figure}

\begin{figure}[htb]
    \includegraphics[width=.5\textwidth]{example-image-a}
\def\after{the copyright for another image}
    \caption%
     [caption for LOF\afterlof]%
     {caption below the image\aftercap}
\end{figure}
\listoffigures
\end{document}

МВЭ

Мой вопрос:

Есть ли способ?нетвручную вставить две команды ( afterlofи aftercap) в каждую подпись? Так что по определению подпись всегда будет выглядеть как \caption[ \afterlof]{ \aftercap}?

решение1

Я предлагаю интерфейс «ключ-значение»:

\documentclass{article}
\usepackage{graphicx}
\usepackage{caption}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\xcaption}{O{}m}
 {% #1 are options, #2 is the main caption text
  \tl_set:Nn \l_lukascb_caption_text_tl { #2 }
  \keys_set:nn { lukascb/caption }
   {
    loftext = #2,
    #1
   }
  \lukascb_make_caption:VVVV
    \l_lukascb_caption_text_tl
    \l_lukascb_caption_aftercap_tl
    \l_lukascb_caption_loftext_tl
    \l_lukascb_caption_afterlof_tl
 }

\tl_new:N \l_lukascb_caption_text_tl

\keys_define:nn { lukascb/caption }
 {
  loftext  .tl_set:N = \l_lukascb_caption_loftext_tl,
  afterlof .tl_set:N = \l_lukascb_caption_afterlof_tl,
  aftercap .tl_set:N = \l_lukascb_caption_aftercap_tl,
 }

\cs_new_protected:Nn \lukascb_make_caption:nnnn
 {
  \caption
    [ #3 \tl_if_empty:nF { #4 } { ;~#4 } ]
    { #1 \tl_if_empty:nF { #2 } { ;~#2 } }
 }
\cs_generate_variant:Nn \lukascb_make_caption:nnnn { VVVV }
\ExplSyntaxOff

\begin{document}

\listoffigures

\section{Main text}

\begin{figure}[!htp]
\centering

\includegraphics[width=.2\textwidth]{example-image-a}

\xcaption[
  loftext=caption for LOF,
  afterlof=copyright for this image,
]{caption below the image}

\end{figure}

\begin{figure}[!htp]
\centering

\includegraphics[width=.2\textwidth]{example-image-a}

\xcaption[
  afterlof=the copyright,
  aftercap=something else,
]{caption below the image}

\end{figure}

\end{document}

Если не указать loftext, используется основной текст подписи. Значение afterlofдобавляется в список рисунков, значение aftercapк основной подписи.

Таким образом, если вы хотите использовать ключи, вам нужно только добавить их.

введите описание изображения здесь

Расширение для \subcaptionbox, синтаксис аналогичен: первый необязательный аргумент \subcaptionboxстановится списком параметров.

\documentclass{article}
\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{xparse}

\captionsetup[sub]{list=true}

\ExplSyntaxOn
\NewDocumentCommand{\xcaption}{O{}m}
 {% #1 are options, #2 is the main caption text
  \tl_set:Nn \l_lukascb_caption_text_tl { #2 }
  \lukascb_make_caption:Nnn \__lukascb_make_caption:VVVV { #1 } { #2 }
 }

\NewDocumentCommand{\xsubcaptionbox}{O{}m}
 {% #1 are options, #2 is the main caption text
  \tl_set:Nn \l_lukascb_caption_text_tl { #2 }
  \lukascb_make_caption:Nnn \__lukascb_make_subcaption:VVVV { #1 } { #2 }
 }

\cs_new_protected:Nn \lukascb_make_caption:Nnn
 {
  \keys_set:nn { lukascb/caption }
   {% first clear the variables
    loftext = #3,
    aftercap = {},
    afterlof = {},
    % then load the given ones
    #2
   }
  #1 \l_lukascb_caption_text_tl \l_lukascb_caption_aftercap_tl
     \l_lukascb_caption_loftext_tl \l_lukascb_caption_afterlof_tl
 }

\tl_new:N \l_lukascb_caption_text_tl

\keys_define:nn { lukascb/caption }
 {
  loftext  .tl_set:N = \l_lukascb_caption_loftext_tl,
  afterlof .tl_set:N = \l_lukascb_caption_afterlof_tl,
  aftercap .tl_set:N = \l_lukascb_caption_aftercap_tl,
 }

\cs_new_protected:Nn \__lukascb_make_caption:nnnn
 {
  \caption
    [ #3 \tl_if_empty:nF { #4 } { ;~#4 } ]
    { #1 \tl_if_empty:nF { #2 } { ;~#2 } }
 }
\cs_generate_variant:Nn \__lukascb_make_caption:nnnn { VVVV }
\cs_new_protected:Nn \__lukascb_make_subcaption:nnnn
 {
  \subcaptionbox
    [ #3 \tl_if_empty:nF { #4 } { ;~#4 } ]
    { #1 \tl_if_empty:nF { #2 } { ;~#2 } }
 }
\cs_generate_variant:Nn \__lukascb_make_subcaption:nnnn { VVVV }
\ExplSyntaxOff

\begin{document}

\listoffigures

\section{Main text}

\begin{figure}[!htp]
\centering

\includegraphics[width=.2\textwidth]{example-image-a}

\xcaption[
  loftext=caption for LOF,
  afterlof=copyright for this image,
]{caption below the image}

\end{figure}

\begin{figure}[!htp]
\centering

\xsubcaptionbox[
  afterlof=the copyright A,
  aftercap=something else,
]{subcaption}{\includegraphics[width=.2\textwidth]{example-image-a}}\qquad
\xsubcaptionbox[
  afterlof=the copyright B,
]{subcaption}{\includegraphics[width=.2\textwidth]{example-image-b}}

\xcaption[
  afterlof=the copyright,
]{caption below the image}

\end{figure}

\end{document}

введите описание изображения здесь

решение2

Быстрый «хак» путем переопределения с помощью \captionи проверки того, определено ли и т. д.xparse\NewDocumentCommand\after

Используйте \def\after{...}или \newcommand{\after}внутри окружения figure, чтобы команда не была определена снаружи, и тест выполнит ветвление false, не выводя дополнительный текст.

\documentclass{article}
\usepackage{graphicx}
\usepackage{xparse}

\usepackage{caption}

\makeatletter
\let\caption@@caption\caption
\RenewDocumentCommand{\caption}{so+m}{%
  \IfBooleanTF{#1}{%
    \caption@@caption*{#3}%
  }{%
    \IfValueTF{#2}{%
      \caption@@caption[#2\@ifundefined{after}{}{\afterlof}]{#3~\@ifundefined{after}{}{\aftercap}}%
    }{%
      \caption@@caption{#3~\csname aftercap\endcsname}
    }%
  }%
}

\makeatother

\newcommand\afterlof{; \after}
\newcommand\aftercap{ }%for optional use
\begin{document}
\begin{figure}[htb]
    \includegraphics[width=.5\textwidth]{example-image-a}
    \def\after{the copyright for this image}
    \caption[caption for LOF]{caption below the image}
\end{figure}

\begin{figure}[htb]
    \includegraphics[width=.5\textwidth]{example-image-a}
    \def\after{Another copyright for another image}
    \def\aftercap{Some info}
    \caption[caption for LOF]{Normal caption below the image}

    \caption{Another caption below the image}
\end{figure}
\listoffigures
\end{document}

введите описание изображения здесь

Альтернативная версия с синтаксисом ключ-значение, обратите внимание на 2-й необязательный аргумент аргумента \caption!

\documentclass{article}
\usepackage{graphicx}
\usepackage{xparse}

\usepackage{caption}

\ExplSyntaxOn
\prop_new:N \l_lukascb_caption_prop 

\keys_define:nn {lukascb} {%
  afterlof .code:n={\prop_put:Nnn \l_lukascb_caption_prop {afterlof} {#1}},
  aftercap .code:n={\prop_put:Nnn \l_lukascb_caption_prop {aftercap} {#1}},
  afterlofsep .code:n={\prop_put:Nnn \l_lukascb_caption_prop {afterlofsep} {#1}}
}

\NewDocumentCommand{\SetLocalCaptionOptions}{m}{%
  \prop_clear:N \l_lukascb_caption_prop 
  \keys_set:nn {lukascb} {afterlofsep={;},#1}
}

\cs_new:Npn \retrievecaptiondata #1{%
  \prop_item:Nn \l_lukascb_caption_prop {#1}%
}


% Normally a `\prg_new_conditional, but for quickness much shorter..

\cs_new:Npn \ifcaptiondatagiven #1#2#3{%
  \prop_if_in:NnTF \l_lukascb_caption_prop {#1} {%
    #2%
  }{#3}
}
\ExplSyntaxOff



\makeatletter
\let\caption@@caption\caption
\RenewDocumentCommand{\caption}{so+mO{}}{%
  \SetLocalCaptionOptions{#4}
  \IfBooleanTF{#1}{%
    \caption@@caption*{#3}%
  }{%
    \IfValueTF{#2}{%
      \caption@@caption[#2\ifcaptiondatagiven{afterlof}{\retrievecaptiondata{afterlofsep}\retrievecaptiondata{afterlof}}{}]{#3~\retrievecaptiondata{aftercap}}%
    }{%
      \caption@@caption{#3~\retrievecaptiondata{aftercap}}
    }%
  }%
}

\makeatother

\begin{document}
\begin{figure}[htb]
    \includegraphics[width=.5\textwidth]{example-image-a}
    \caption[First caption for LOF]{caption below the image}[afterlof={\textcopyright\ By me!}, aftercap={And now for something completely different}]
\end{figure}

\begin{figure}[htb]
    \includegraphics[width=.5\textwidth]{example-image-a}
    \caption[caption for LOF]{Normal caption below the image}[afterlofsep={\S}]

    \caption{Another caption below the image}[aftercap={Nudge nudge}]
\end{figure}
\listoffigures
\end{document}

введите описание изображения здесь

Связанный контент