我需要创建双语文档,左栏为俄语,右栏为英语。为此,我选择了包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}}
它可以工作,但是所有两列图像都只插入到部分之后,但我需要将它们插入到提到它们的位置。因此,我需要某种方法来同步列并在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 语法。但不幸的是,正常的语法会更加笨重。