Como posso escrever no arquivo parte do texto entre duas bandeiras?

Como posso escrever no arquivo parte do texto entre duas bandeiras?

Preciso criar um documento bilíngue, coluna da esquerda em russo e direita em inglês. Para este propósito eu escolho package paracol. Mas para tornar mais fácil para o tradutor traduzir o texto em russo, quero colocar todas as partes em russo em um grupo de arquivos (nomeado somedir/text_rus.tex) e todas as partes em inglês em outro (nomeado somedir/text_eng.tex). Para inseri-los eu crio macro

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

Funciona, mas todas as imagens de duas colunas são inseridas somente após a peça, mas preciso que elas sejam inseridas onde foram mencionadas. Então, preciso sincronizar colunas e inserir imagens fora paracoldo ambiente.

Eu tento tal coisa:

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

A ideiaé inserir a parte em inglês antes do russo para criar muitos arquivos pequenos com texto entre as imagens, depois disso simplesmente \inputo conteúdo desses arquivos após o texto em russo, fecho paracole coloco a imagem.

O problemaé como simplificar isso. Como posso simplesmente colocar algum marcador como \syncpointno arquivo em inglês e, ao processá-lo, escrever o texto entre os marcadores consequentes em outro arquivo temporário?

Ou talvez eu não tenha ouvido falar de algum pacote que possa resolver meu problema - sincronizar texto em duas colunas sem precisar escrever esse texto consequente em um arquivo?

Responder1

Uma coisa que você pode fazer facilmente é colocar todo o texto em macros e depois mesclá-los. Você pode ficar sem memória rapidamente.

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

Responder2

Aqui está uma solução. (eu 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}

Exemplo 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...

exemplo text_eng.tex

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

insira a descrição da imagem aqui

Responder3

Obrigado a @egreg!Esta respostafoi muito útil. Então, eu crio um MWE que mostra uma ideia.

Conteúdo do arquivo 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}

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

E conteúdo de 01/text_eng.tex:

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

Aqui está o resultado:
(fonte:pic4a.ru)

O único problema é precisar escrever \startsyncno início de cada arquivo em inglês e \endsyncno final, porque construções como \startsync\input{file}\endsyncdentro da macro não funcionam.

PSoutra parte muito ruim deste código é o uso da terrível sintaxe latex3e. Mas infelizmente a sintaxe normal seria muito mais complicada.

informação relacionada