Wie kann ich einen Textteil zwischen zwei Flaggen in eine Datei schreiben?

Wie kann ich einen Textteil zwischen zwei Flaggen in eine Datei schreiben?

Ich muss ein zweisprachiges Dokument erstellen, die linke Spalte ist russisch und die rechte englisch. Zu diesem Zweck wähle ich das Paket paracol. Um es dem Übersetzer jedoch einfacher zu machen, russische Texte zu übersetzen, möchte ich alle russischen Teile in eine Dateigruppe (benannt somedir/text_rus.tex) und alle englischen in eine andere (benannt somedir/text_eng.tex) einfügen. Um sie einzugeben, erstelle ich ein Makro

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

Es funktioniert, aber alle zweispaltigen Bilder werden erst nach dem Teil eingefügt, aber ich muss sie dort einfügen, wo sie erwähnt wurden. Ich brauche also eine Möglichkeit, Spalten zu synchronisieren und Bilder außerhalb paracolder Umgebung einzufügen.

Ich versuche so etwas:

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

Die Ideebesteht darin, den englischen Teil vor dem russischen einzugeben, um viele kleine Dateien mit Text zwischen den Bildern zu erstellen. Danach füge ich einfach \inputden Inhalt dieser Dateien nach dem russischen Text ein, schließe paracolund füge das Bild ein.

Das Problemist, wie man das vereinfacht. Wie kann ich einfach einige Markierungen \syncpointin eine englische Datei einfügen und beim Verarbeiten den Text zwischen den nachfolgenden Markierungen in eine andere temporäre Datei schreiben?

Oder habe ich vielleicht noch nichts von einem Paket gehört, das mein Problem lösen kann – Text in zwei Spalten synchronisieren, ohne den Text anschließend in eine Datei schreiben zu müssen?

Antwort1

Sie können den gesamten Text ganz einfach in Makros packen und diese dann zusammenführen. Allerdings kann es sein, dass Ihnen dabei recht schnell der Speicher ausgeht.

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

Antwort2

Hier ist eine Lösung. (Ich verwende Französisch)

\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-Beispiel:

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

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

Bildbeschreibung hier eingeben

Antwort3

Danke an @egreg!Diese Antwortwar sehr nützlich. Also erstelle ich ein MWE, das eine Idee zeigt.

Inhalt der Datei 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}

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

Und Inhalt von 01/text_eng.tex:

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

Hier ist das Ergebnis:
(Quelle:pic4a.ru)

Das einzige Problem besteht darin, dass am Anfang und am Ende \startsyncjeder englischen Datei etwas geschrieben werden muss , da Konstruktionen wie innerhalb eines Makros nicht funktionieren.\endsync\startsync\input{file}\endsync

PSEin weiterer sehr schlechter Teil dieses Codes ist die Verwendung der schrecklichen Latex3e-Syntax. Aber leider wäre die normale Syntax viel umständlicher.

verwandte Informationen