두 플래그 사이의 텍스트 일부를 파일에 쓰려면 어떻게 해야 합니까?

두 플래그 사이의 텍스트 일부를 파일에 쓰려면 어떻게 해야 합니까?

이중 언어 문서를 만들어야 합니다. 왼쪽 열은 러시아어로, 오른쪽 열은 영어로 작성해야 합니다. 이를 위해 나는 package 를 선택합니다 paracol. 하지만 번역가가 러시아어 텍스트를 더 쉽게 번역할 수 있도록 모든 러시아어 부분을 한 파일 그룹( 이름 somedir/text_rus.tex)에 넣고 모든 영어 부분을 다른 파일 그룹( 이름 somedir/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

비교적 쉽게 할 수 있는 한 가지는 모든 텍스트를 매크로에 넣은 다음 함께 병합하는 것입니다. 하지만 메모리가 빨리 부족해질 수 있습니다.

\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 구문을 사용한다는 것입니다. 그러나 불행히도 일반 구문은 훨씬 더 부피가 커집니다.

관련 정보