2 つのフラグ間のテキストの一部をファイルに書き込むにはどうすればよいでしょうか?

2 つのフラグ間のテキストの一部をファイルに書き込むにはどうすればよいでしょうか?

左の列がロシア語、右の列が英語のバイリンガル文書を作成する必要があります。この目的のために、パッケージを選択します。ただし、翻訳者がロシア語のテキストを翻訳しやすくするために、すべてのロシア語部分を 1 つのファイル グループ ( という名前) に、すべての英語部分を別のファイル グループ ( という名前)paracolに入れたいと思います。これらを入力するために、マクロを作成します。somedir/text_rus.texsomedir/text_eng.tex

\long\def\biinput#1{\begin{paracol}{2}\rus\input{#1/text_rus}\switchcolumn%
    \eng\input{#1/text_eng}\end{paracol}}

動作しますが、2 列の画像はすべてパーツの後にのみ挿入されますが、指定された場所に挿入する必要があります。そのため、列を同期してparacol環境外で画像を挿入する方法が必要です。

私は次のようなことを試します:

\newcount\p@rts
\p@rts0
\long\def\writepart#1{
    \newwrite\file
    \advance\p@rts1
    \immediate\openout\file=tmp/\number\[email protected]
    \immediate\write\file{#1}
    \immediate\closeout\file
}

アイデアロシア語の前に英語の部分を入力して、画像の間にテキストが入った小さなファイルをたくさん作成し、その後、\inputそのファイルの内容をロシア語のテキストの後に入力して閉じparacol、画像を配置します。

問題\syncpointこれを単純化する方法。英語のファイルなどにマーカーをいくつか置き、処理時にマーカー間のテキストを別の一時ファイルに書き込むにはどうすればよいですか?

それとも、私の問題を解決できるパッケージについて聞いたことがないのでしょうか。つまり、このテキストの結果を 1 つのファイルに書き込むことなく、2 列のテキストを同期できるパッケージについて聞いたことがないのでしょうか。

答え1

かなり簡単にできることの 1 つは、すべてのテキストをマクロに入れて、それらを結合することです。ただし、メモリがすぐに不足する可能性があります。

\documentclass{article}
\usepackage{paracol}
\usepackage{mwe}

\newcounter{merge}
\globalcounter{merge}
\renewcommand{\themerge}{\Alph{merge}}

\newcommand{\merge}[1]% #1 = number of bloxks to merge
{\loop\stepcounter{merge}%
  \csname rus\themerge\endcsname
  \global\expandafter\let\csname rus\themerge\endcsname=\relax% erase macro
  \switchcolumn
  \csname eng\themerge\endcsname
  \global\expandafter\let\csname rus\themerge\endcsname=\relax% erase macro
  \switchcolumn*
  \ifnum\value{merge}<#1\repeat
 }
%left column to end
\newcommand{\rusA}{\lipsum[1]}
\newcommand{\rusB}{%
  \end{paracol}
  {\centering\includegraphics{example-image}}
  \begin{paracol}{2}
  \lipsum[2]}
%right column to end
\newcommand{\engA}{First paragraph}
\newcommand{\engB}{Second paragraph}
%merge macros
\begin{document}
\begin{paracol}{2}
\merge{2}
\end{paracol}
\end{document}

答え2

解決策はこれです。(私はフランス語を使います)

\documentclass{article}
\usepackage{mwe}

\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{paracol}
\usepackage[frenchb,english]{babel}

\newcount\mt
\newcount\mtt

\def\rus{\selectlanguage{french}}
\def\eng{\selectlanguage{english}}

\def\syncpoint{%
\ifnum\mt=0\else\egroup\fi
\advance\mt by 1\relax%
\setbox\the\mt=\vbox\bgroup}

\long\def\biinput#1{%
\begin{paracol}{2}
\rus\input{#1/text_rus}%
\eng\input{#1/text_eng}%
\egroup%
\mtt=\mt\relax%
\divide\mtt by 2\relax%
\mt=0\relax%
\loop
\ifnum\mt<\mtt
\advance\mt by 1\relax%
\unvbox\the\mt%
\par\medskip%
\switchcolumn%
\unvbox\numexpr\mtt+\mt\relax%
\par\medskip%
\switchcolumn*%
\repeat
\end{paracol}}


\begin{document}
\biinput{treza}
\end{document}

text_rus.tex サンプル:

\syncpoint\textbf{B1}
Généralement, ...
\syncpoint\textbf{B2}
Ce texte a ...
\syncpoint\textbf{B3}
Il circule ...
\syncpoint\textbf{B4}
Nulla facilisi...

text_eng.tex サンプル

\syncpoint\textbf{A1}
Lorem ipsum dolor... 
\syncpoint\textbf{A2}
Class aptent... 
\syncpoint\textbf{A3}
Mauris ipsum...
\syncpoint\textbf{A4}
Nulla facilisi...

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

答え3

@egreg に感謝します!この答えとても役に立ちました。そこで、アイデアを示す MWE を作成します。

ファイルの内容main.tex:

\documentclass[a4paper,12pt]{extarticle}
\usepackage{paracol}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{expl3}
\makeatletter
\def\@engfigure{Fig.}\def\@rusfigure{Рис.}
\def\@engtable{Table}\def\@rustable{Таблица}
\long\def\bicaption#1#2{%
    \refstepcounter\@captype\vskip\abovecaptionskip
    {\itshape\protect\select@language{russian}%
    {{\bfseries\csname @rus\@captype\endcsname\,\csname%
        the\@captype\endcsname:}}~{#1}\par\vspace{8pt}
    \protect\select@language{english}%
    {{\bfseries\csname @eng\@captype\endcsname\,\csname%
        the\@captype\endcsname:}}~{#2}\par}
}
\def\rus{\selectlanguage{russian}}
\def\eng{\selectlanguage{english}}
\ExplSyntaxOn
\seq_new:N \en_seq_items
\int_new:N \en_seq_ctr
\cs_new_protected:Npn \startsync #1 \endsync{
    \seq_set_split:Nnn \en_seq_items { \syncpoint } { #1 }
    \seq_map_inline:Nn \en_seq_items
    {
        \int_gincr:N \en_seq_ctr
        \tl_gset:cn { en_part \int_to_roman:n { \en_seq_ctr} _tl } { ##1 }
    }
}
\def\insrt#1{\tl_use:c { en_part \int_to_roman:n { #1 } _tl }}
\def\paraend{\int_gincr:N \en_seq_ctr\switchcolumn\eng\insrt{\en_seq_ctr}\end{paracol}\rus}
\def\parastart{\begin{paracol}{2}\rus}
\long\def\biinput#1{\global\en_seq_ctr0\eng\input{#1/text_eng}%
    \global\en_seq_ctr0\parastart\input{#1/text_rus}\paraend}
\ExplSyntaxOff
\makeatother
\def\arule{\vspace{1em}\hrule\vspace{1em}}
\begin{document}
\biinput{01}
\end{document}

の内容01/text_rus.tex

\section{Какой-то раздел}
Первый абзац
\paraend
\arule
\begin{figure*}[!h]
Here we can paste a wide image
\bicaption{Название изображения на русском языке}{English image name}
\end{figure*}
\arule
\parastart
Второй абзац
\paraend
\arule
Текст шириной на две колонки вне окружения \verb'paracol'.
\arule
\parastart
И заключительный кусок текста

内容01/text_eng.tex

\startsync
\section{Some section}
First paragraph
\syncpoint
Second paragraph
\syncpoint
Third paragraph
\endsync

結果は次のとおりです:
(ソース:出典: pic4a.ru

唯一の問題は、マクロ内の構造のような構造が機能しないため、\startsyncすべての英語ファイルの最初と\endsync最後に記述する必要があることです。\startsync\input{file}\endsync

追伸このコードのもう一つの非常に悪い部分は、ひどい latex3e 構文の使用です。しかし残念ながら、通常の構文ははるかに大きくなります。

関連情報