자동 내보내기를 위해 그림 환경을 그림*으로 로컬에서 재정의

자동 내보내기를 위해 그림 환경을 그림*으로 로컬에서 재정의

pandoc저는 회사 레이아웃이 포함된 문서를 생성하기 위해 Latex 기반의 워크플로를 사용하고 있습니다 . 서식의 일부는 여백 내부에 설정된 캡션이며 때로는 텍스트와 여백 영역에 걸쳐 있는 이미지를 사용합니다. 패키지를 사용하면 두 가지 모두 쉽게 달성할 수 있습니다 sidenotes. 환경 을 수정하는 큰 수치를 가능하게 합니다 figure*.

일반 텍스트 문서에서 일반 문서 figure와 일반 문서 사이를 전환하는 것은 figure*물론 문제가 되지 않습니다. 하지만 pandoc마크다운부터 Latex, PDF까지 자동화된 작업 흐름을 사용해야 합니다 . 불행하게도 pandoc별표 표시된 환경과 일반 환경 간에 전환할 수 있는 기본 제공 옵션은 제공하지 않습니다. 따라서 나는 별표로 표시된 그림을 그룹 내에서 래핑하고 거기에서 figure처럼 작동하도록 로컬로 재정의하는 Lua 필터를 작성했습니다 figure*. pandoc항상 일반 명령을 출력하므로 이는 필요합니다 figure. 불행하게도 나는 그것을 작동시킬 수 없습니다. 다음은 출력이 될 수 있는 짧은 Latex 예제가 포함된 MWE입니다 pandoc.

% !TeX lualatex
\documentclass{article}
\usepackage{sidenotes}
\usepackage[outer=4cm]{geometry}
\usepackage{blindtext}
\begin{document}
\blindtext
\begingroup
\RenewEnvironmentCopy{figure}{figure*}
\begin{figure}
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure}
\endgroup
\end{document}

로그에는 다음 오류 메시지가 표시됩니다.

! TeX capacity exceeded, sorry [save size=200000].
\tl_set:Nn ..._set:Ne #1{\__kernel_exp_not:w {#2}}
                                                  
l.11 \rule
        {\linewidth}{2ex}
If you really absolutely need more capacity,
you can ask a wizard to enlarge me.

TeX의 용량을 확대해도 문제가 해결되지 않습니다. graphicx규칙 대신 이미지를 로드하여 사용하는 경우에도 문제가 지속됩니다 .

이 문제를 해결하는 방법에 대한 몇 가지 아이디어가 있기를 바랍니다.

지역적으로 재정의하는 다른 접근 방식 figurefigure*매우 환영합니다. 그러나 Latex 문서에서 환경 자체는 단순으로 입력되어야 합니다. figure이 출력은 pandoc.

편집하다

@cabohas 솔루션 덕분에 작동하게 되었습니다. 다음은 pandoc과 함께 사용하는 Lua 필터입니다 pandoc -s -L path/to/filter.lua file.md -o file.tex.

if FORMAT:match 'latex' then
   function Figure (elem)
      local starred = elem.content[1].content[1].attributes['starred']
      if starred and starred == "true" then
         return {
            pandoc.RawInline('latex', '\\defaultwidefiguretrue'),
            elem,
            pandoc.RawInline('latex', '\\defaultwidefigurefalse')
         }
      else
         return elem
      end
   end
end

답변1

문제는 의 sidenote정의가 figure*내부적으로 figure. 따라서 재정의한 후 figure*내부 사용법도 를 사용합니다 figure*. 이로 인해 무한 루프가 발생합니다.

두 가지 새로운 환경 을 정의하는 것이 좋습니다 figure-. 일반 의 단순 복사본일 수 있지만 대신 을 사용하는 의 복사본이어야 합니다 . 그런 다음 스위치 에 따라 또는 를 사용하도록 재정의할 수 있습니다 . 또한 다음의 별칭으로 변경되어야 합니다 .figure+figure-figurefigure+figure*figure-figurefigurefigure-figure+\if…figure*figure+

\documentclass{article}
\usepackage{sidenotes}
\usepackage[outer=4cm]{geometry}
\usepackage{blindtext}
\NewEnvironmentCopy{figure-}{figure}
\makeatletter
\NewDocumentEnvironment{figure+}{ O{htbp} }
{
    \begin{figure-}[#1]
        \begin{autoadjustwidth}{}{-\@sidenotes@extrawidth}
        \captionsetup{style=widefigure}
}
{
        \end{autoadjustwidth}
    \end{figure-}
}
\makeatother  
\newif\ifdefaultwidefigure
\RenewDocumentEnvironment{figure}{ O{htbp} }
{
  \ifdefaultwidefigure
    \def\figureenvtype{figure+}%
  \else
    \def\figureenvtype{figure-}%
  \fi
  \begin{\figureenvtype}[#1]%
}
{
  \end{\figureenvtype}
}
\RenewEnvironmentCopy{figure*}{figure+}
\begin{document}
\blindtext
\defaultwidefigurefalse% first example not wide
\begin{figure}
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure}

\blindtext
\defaultwidefiguretrue% second example wide
\begin{figure}
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure}

\blindtext
\begin{figure*}% third example wide by used environment
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure*}


\end{document}

여기에 이미지 설명을 입력하세요

관련 정보