ドキュメント全体で複数回参照するコンテンツブロックを作成する

ドキュメント全体で複数回参照するコンテンツブロックを作成する

すべて同じ項目を含む一連の演習を作成する必要があります。

  • タイトル
  • 画像
  • 質問
  • ソリューション
  • 等..

各演習ごとに個別のファイルを作成し、メイン ドキュメントからこれらの特定のセクションを複数回参照できるようにしたいと考えています。各項目内に方程式、画像、tikz などを配置できるようにしたいと考えています。

それぞれのケースのマクロ定義を含むファイルを作成することを検討しました。例:

例1.sty

\newcommand\ex1sol{
(contents)
}
...

次に、必要な場所でマクロを呼び出しますが、これは機能しません。これは珍しいアプリケーションではないと思われるため、とにかくもっと良い解決策があるはずだと感じています。本質的には、同じコンテンツを異なる形式で表示することを意味します。

答え1

の変種として私の答えLatexコードチャンクをライブラリとして使用する - 図などのLatex要素を複数の表現で再利用するため指定可能なセクションを持つファイルがパターンであるインターフェースを提供できます

\filesection{⟨name of section⟩}
⟨code⟩
\endfilesection
%-------------------------------------------------------------
\filesection{⟨name of section⟩}
⟨code⟩
\endfilesection
%-------------------------------------------------------------
\filesection{⟨name of section⟩}
⟨code⟩
\endfilesection
%-------------------------------------------------------------
\endinput

これらのファイルは次のコマンドで入力できます

\inputfilesection{⟨name of file⟩}{⟨name of section⟩}

⟨コード⟩ファイルセクションの-command\inputfilesection\filesection-comandの両方が同じである場合にのみ実行されます⟨セクション名⟩-口論。

この場合⟨コード⟩verbatim-catcode-régime で読み取られます。その後、結果が\scantokens再トークン化と通常の処理のために渡されます。

複数の\filesectionsが同じになることがある⟨セクション名⟩この場合、ファイル内に出現する問題の名前のすべてのファイルセクションは によって配信されます\inputfilesection

私が認識している注意事項:

!!!\inputfilesectionによって呼び出されるファイル内では実行しないでください。!!!\inputfilesection

%
% An example file with \filesection-commands:
%
%\begin{filecontents*}[overwrite]{FileWithSections.tex}
\begin{filecontents*}{FileWithSections.tex}
\filesection{First Section}
Some text in First Section Of FileWithSections.tex.
\begin{verbatim*}
Some verbatim material in 
First Section Of FileWithSections.tex.
\end{verbatim*}
\endfilesection
%-------------------------------------------------------------
\filesection{Second Section}
Some text in Second Section Of FileWithSections.tex.
\begin{verbatim*}
Some verbatim material in 
Second Section Of FileWithSections.tex.
\end{verbatim*}
\endfilesection
%-------------------------------------------------------------
\filesection{Third Section}
Some text in Third Section Of FileWithSections.tex.
\begin{verbatim*}
Some verbatim material in 
Third Section Of FileWithSections.tex.
\end{verbatim*}
\endfilesection
%-------------------------------------------------------------
\endinput
\end{filecontents*}



\documentclass{article}
\usepackage{graphicx}

\makeatletter
%///// start of code that could go into a package / .sty-file//////////////////
\@ifundefined{NewDocumentCommand}{\RequirePackage{xparse}}{}%
\NewDocumentCommand\inputfilesection{mm}{%
  \def\@stringincommand{#2}%
  \input{#1}%
}%
\newcommand\@stringincommand{}%
\newcommand\@stringinfile{}%
\NewDocumentCommand\filesection{m}{%
  \begingroup
  \let\do\@makeother\dospecials
  \do\^^I%
  \do\^^M%
  \@filesection{#1}%
}%
\begingroup
\newcommand\@filesection[2]{%
  \endgroup
  \def\@filesection##1##2#1{%
     \def\@stringinfile{##1}%
     \expandafter\endgroup
     \ifx\@stringinfile\@stringincommand\expandafter\@firstofone\else\expandafter\@gobble\fi
     {%
       \begingroup
       \newlinechar=\endlinechar
       \scantokens\expandafter\expandafter\expandafter{%
       \expandafter\expandafter\expandafter\endgroup
       \UD@RemoveLeadingNTrailingCarriageReturn{##2}#2}%
     }\ignorespaces
  }%
}%
\@firstofone{%
  \let\do\@makeother\dospecials
  \catcode`\{=1 %
  \catcode`\}=2 %
  \@filesection
}{\endfilesection}{\ignorespaces%}%
%=================================================================================
% Begin of code for removing one leading and one trailing explicit
% <carriage-return>-character-token of catcode 12(other) from _verbatimized_ 
% argument
%=================================================================================
\@ifdefinable\UD@stopromannumeral{\chardef\UD@stopromannumeral=`\^^00}%
%%-----------------------------------------------------------------------------
%% Check whether argument is empty:
%%.............................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%%                     {<Tokens to be delivered in case that argument
%%                       which is to be checked is empty>}%
%%                     {<Tokens to be delivered in case that argument
%%                       which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
\newcommand\UD@CheckWhetherNull[1]{%
  \romannumeral\expandafter\@secondoftwo\string{\expandafter
  \@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
  \@secondoftwo\string}\expandafter\@firstoftwo\expandafter{\expandafter
  \@secondoftwo\string}\expandafter\UD@stopromannumeral\@secondoftwo}{%
  \expandafter\UD@stopromannumeral\@firstoftwo}%
}%
%%-----------------------------------------------------------------------------
\begingroup
\@makeother\^^M%
\@firstofone{%
  \endgroup%
  %%=============================================================================
  %% Check whether_verbatimized_ argument has a leading explicit 
  %% <carriage-return>-character-token of catcode 12(other):
  %%-----------------------------------------------------------------------------
  %% \UD@CheckWhetherLeadingCarriageReturn{<Argument which is to be checked>}%
  %%                                      {<Tokens to be delivered in case
  %%                                       <argument which is to be checked>'s
  %%                                       1st token is an explicit <carriage-
  %%                                       return>-character-token of 
  %%                                       catcode 12(other)>}%
  %%                                      {<Tokens to be delivered in case
  %%                                       <argument which is to be checked>'s
  %%                                       1st token is not an explicit
  %%                                       <carriage-return>-character-token of 
  %%                                       catcode 12(other)>}%
  \newcommand\UD@CheckWhetherLeadingCarriageReturn[1]{%
    \UD@@CheckWhetherLeadingCarriageReturn\UD@SelDom#1\UD@SelDom^^M\UD@@SelDom%
  }%
  \@ifdefinable\UD@@CheckWhetherLeadingCarriageReturn{%
    \long\def\UD@@CheckWhetherLeadingCarriageReturn#1\UD@SelDom^^M#2\UD@@SelDom{%
      \UD@CheckWhetherNull{#2}{\@secondoftwo}{\@firstoftwo}%
    }%
  }%
  %%-----------------------------------------------------------------------------
  %% Check whether_verbatimized_ argument having a leading explicit <carriage-
  %% return>-character-token of catcode 12(other) consists only of such tokens:
  %%-----------------------------------------------------------------------------
  %% \UD@CheckWhetherOnlyCarriageReturn{<Argument which is to be checked and 
  %%                                    which is known to have a leading explicit
  %%                                    <carriage-return>-character-token of
  %%                                    catcode 12(other)>}%
  %%                                   {<Tokens to be delivered in case <argument
  %%                                    which is to be checked> consists only
  %%                                    of explicit <carriage-return>-character-
  %%                                    tokens of catcode 12(other)>}%
  %%                                   {<Tokens to be delivered in case <argument
  %%                                    which is to be checked> does not consist
  %%                                    only of explicit <carriage-return>-
  %%                                    character-tokens of catcode 12(other)>}%
  \newcommand\UD@CheckWhetherOnlyCarriageReturn[1]{%
    \UD@CheckWhetherLeadingCarriageReturn{#1}{%
      \expandafter\UD@CheckWhetherOnlyCarriageReturn%
      \expandafter{\UD@@TrimLeadingCarriageReturn#1}%
    }{%
      \UD@CheckWhetherNull{#1}{\@firstoftwo}{\@secondoftwo}%
    }%
  }%
  %%-----------------------------------------------------------------------------
  %% Remove one leading explicit <carriage-return>-character-token of 
  %% catcode 12(other) from _verbatimized_ argument:
  %%-----------------------------------------------------------------------------
  \@ifdefinable\UD@@TrimLeadingCarriageReturn{%
    \long\def\UD@@TrimLeadingCarriageReturn^^M{}%
  }%
  %%-----------------------------------------------------------------------------
  %% Check whether_verbatimized_ argument has a trailing explicit 
  %% <carriage-return>-character-token of catcode 12(other):
  %%-----------------------------------------------------------------------------
  %% \UD@CheckWhetherTrailingCarriageReturn{<Argument which is to be checked>}%
  %%                                      {<Tokens to be delivered in case
  %%                                       <argument which is to be checked>'s
  %%                                       last token is an explicit <carriage-
  %%                                       return>-character-token of 
  %%                                       catcode 12(other)>}%
  %%                                      {<Tokens to be delivered in case
  %%                                       <argument which is to be checked>'s
  %%                                       last token is not an explicit
  %%                                       <carriage-return>-character-token of 
  %%                                       catcode 12(other)>}%
  \newcommand\UD@CheckWhetherTrailingCarriageReturn[1]{%
    \UD@@CheckWhetherTrailingCarriageReturn#1\UD@SelDom^^M\UD@SelDom\UD@@SelDom%
  }%
  \@ifdefinable\UD@@CheckWhetherTrailingCarriageReturn{%
    \long\def\UD@@CheckWhetherTrailingCarriageReturn#1^^M\UD@SelDom#2\UD@@SelDom{%
      \UD@CheckWhetherNull{#2}{\@secondoftwo}{\@firstoftwo}%
    }%
  }%
  %%-----------------------------------------------------------------------------
  %% Remove one trailing explicit <carriage-return>-character-token of 
  %% catcode 12(other) from _verbatimized_ argument:
  %%-----------------------------------------------------------------------------
  \newcommand\UD@TrimTrailingCarriageReturn[1]{%
     \UD@@TrimTrailingCarriageReturn#1\UD@SelDom%
  }%
  \@ifdefinable\UD@@TrimTrailingCarriageReturn{%
    \long\def\UD@@TrimTrailingCarriageReturn#1^^M\UD@SelDom{#1}%
  }%
  %%-----------------------------------------------------------------------------
  %% Remove one leading and one trailing explicit <carriage-return>-character-
  %% token of catcode 12(other) from _verbatimized_ argument if present.
  %% In the edge case of the _verbatimized_ argument consisting only of explicit
  %% <carriage-return>-character-tokens of catcode 12(other) remove only one of 
  %% them.
  %% Due to \romannumeral-expansion the result is delivered in 2 expansion-steps:
  %%-----------------------------------------------------------------------------
  \newcommand\UD@RemoveLeadingNTrailingCarriageReturn[1]{%
    \romannumeral%
    \UD@CheckWhetherLeadingCarriageReturn{#1}{%
      \UD@CheckWhetherTrailingCarriageReturn{#1}{%
         \UD@CheckWhetherOnlyCarriageReturn{#1}{%
           \expandafter\UD@stopromannumeral\UD@@TrimLeadingCarriageReturn#1%
         }{%
           \expandafter\expandafter\expandafter\expandafter\expandafter%
           \expandafter\expandafter\UD@stopromannumeral\expandafter%
           \UD@TrimTrailingCarriageReturn\expandafter{\UD@@TrimLeadingCarriageReturn#1}%
         }%
      }{%
        \expandafter\UD@stopromannumeral\UD@@TrimLeadingCarriageReturn#1%
      }%
    }{%
      \UD@CheckWhetherTrailingCarriageReturn{#1}{%
        \expandafter\expandafter\expandafter\UD@stopromannumeral%
        \UD@TrimTrailingCarriageReturn{#1}%
      }{\UD@stopromannumeral#1}%
    }%
  }%
}%
%================================================================================
% End of code for removing one leading and one trailing explicit
% <carriage-return>-character-token of catcode 12(other) from _verbatimized_ 
% argument
%================================================================================
%///// end of code that could go into a package / .sty-file////////////////////
\makeatother


\begin{document}

\noindent
\inputfilesection{FileWithSections.tex}{First Section}

\noindent\hrule\null

\noindent
\inputfilesection{FileWithSections.tex}{Second Section}

\noindent\hrule\null

\noindent
\inputfilesection{FileWithSections.tex}{Third Section}

\noindent\hrule\null

\noindent
\inputfilesection{FileWithSections.tex}{First Section}

\noindent\hrule\null

\noindent
\inputfilesection{FileWithSections.tex}{Second Section}

\noindent\hrule\null

\noindent
\inputfilesection{FileWithSections.tex}{Third Section}

\end{document}

ここに画像の説明を入力してください

関連情報