¿Cómo puedo escribir para archivar parte del texto entre dos banderas?

¿Cómo puedo escribir para archivar parte del texto entre dos banderas?

Necesito crear un documento bilingüe, la columna izquierda en ruso y la derecha en inglés. Para ello elijo el paquete paracol. Pero para que al traductor le resulte más fácil traducir texto en ruso, quiero colocar todas las partes en ruso en un grupo de archivos (llamado somedir/text_rus.tex) y todas las partes en inglés en otro (llamado somedir/text_eng.tex). Para ingresarlos creo una macro.

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

Funciona, pero todas las imágenes de dos columnas se insertan solo después de la parte, pero necesito que se inserten donde se mencionaron. Entonces, necesito alguna forma de sincronizar columnas e insertar imágenes fuera paracoldel entorno.

Intento tal cosa:

\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
}

La ideaes ingresar la parte en inglés antes del ruso para crear muchos archivos pequeños con texto entre imágenes, luego de eso simplemente el \inputcontenido de esos archivos después del texto en ruso, cierro paracoly pongo la imagen.

El problemaes cómo simplificar esto. ¿Cómo puedo simplemente poner algún marcador como \syncpointen un archivo en inglés y, cuando lo proceso, escribir texto entre los marcadores consiguientes en otro archivo temporal?

¿O tal vez no escuché acerca de algún paquete que pueda resolver mi problema: sincronizar texto en dos columnas sin necesidad de escribir este texto en un solo archivo?

Respuesta1

Una cosa que puedes hacer con bastante facilidad es poner todo el texto en macros y luego fusionarlos. Sin embargo, es posible que te quedes sin memoria bastante rápido.

\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}

Respuesta2

Aquí hay una solución. (yo uso francés)

\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}

Ejemplo de 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...

muestra text_eng.tex

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

ingrese la descripción de la imagen aquí

Respuesta3

¡Gracias a @egreg!esta respuestafue muy útil. Entonces, creo un MWE que muestra una idea.

Contenido del archivo 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}

Contenido de 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
И заключительный кусок текста

Y contenidos de 01/text_eng.tex:

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

Aquí está el resultado:
(fuente:pic4a.ru)

El único problema es que es necesario escribir \startsyncal principio de cada archivo en inglés y \endsyncal final, porque la construcción como \startsync\input{file}\endsyncla macro interna no funciona.

PDOtra parte muy mala de este código es el uso de una terrible sintaxis de látex3e. Pero, lamentablemente, la sintaxis normal sería mucho más complicada.

información relacionada