我定义了两个自定义宏:
\translation{ORIGINAL}{TRANSLATION}
\printtranslations
第一个宏打印出译文,并将原文和译文放入列表中。可以使用宏打印该列表\printtranslations
。
这很好用。不过我还想在文档内部跳转翻译和原来的。
我尝试使用引用计数器,但不知道如何使用。目前,我不会自动创建标签,并且始终使用相同的引用跳转到翻译。
这是我当前的代码
\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{tabularx}
\usepackage{forloop}
% Macro creating a translation.
\def\mytranslations{}
\listadd{\mytranslations}{}
\newcommand{\translation}[2]{ %
#2 %
\textsuperscript{ %
\hspace{-0.2cm} %
(\hyperlink{chap:Translations}{Translation}) %
} %
\listgadd{\mytranslations}{#1\unexpanded{&}#2 \\} %
}
% Macro showing all translations.
\newcommand{\showtranslations}[1]{#1}
\newcommand{\printtranslations}{ %
{ %
\begin{tabularx}{\textwidth}{XX} %
\textbf{Original} & \textbf{Translation} \\ %
\hline %
\forlistloop{\showtranslations}{\mytranslations} \\ %
\end{tabularx} %
} %
}
\begin{document}
\translation{Bad}{Microsoft Word}
\clearpage
\translation{Good}{TeX} and \translation{Better}{LaTeX}
\clearpage
\hypertarget{chap:Translations}
\printtranslations
\end{document}
有人能告诉我正确的方法该怎么做吗?
答案1
这是不是最好的解决方案,但只是一次试验——>我将原文/翻译对分成两个列表,这两个列表必须分别遍历,但可以更轻松地进行以后的转换。
两个列表均在表内的外循环中完成。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{longtable}
\usepackage{soul}
\usepackage{tabu}
\usepackage{forloop}
\usepackage{hyperref}
\newcounter{translation}
\listgadd{\myoriginals}{}%
%\gdef\mytranslations{}
\listgadd{\mytranslations}{}
\newcommand{\translation}[2]{%
\refstepcounter{translation}%
{\sethlcolor{Snow2}\hl{#2}}%\bookmark[dest=chap:Translations::\number\value{translation}]{#2}}%
\textsuperscript{(\phantomsection\hyperlink{chap:Original::\number\value{translation}}{Translation})}%
\listgadd{\myoriginals}{#1}%
\listgadd{\mytranslations}{#2}%
}
\newcommand{\showorig}[2]{%
\stepcounter{seconddummycounter}%
\ifnumequal{\value{seconddummycounter}}{#1}{%
\phantomsection\hypertarget{chap:Original::\number\value{seconddummycounter}}{#2}%
}{%
}%
}%
\newcommand{\showtrans}[2]{%
\stepcounter{seconddummycounter}%
\ifnumequal{\value{seconddummycounter}}{#1}{%
#2%
}{%
}%
}%
\newcounter{dummycounter}%
\newcounter{seconddummycounter}%
\newcommand{\showall}{%
\forloop{dummycounter}{1}{\number\value{dummycounter} < \numexpr\number\value{translation}+1}{%
\setcounter{seconddummycounter}{0} \forlistloop{\showorig{\number\value{dummycounter}}}{\myoriginals} & \setcounter{seconddummycounter}{0} \forlistloop{\showtrans{\number\value{dummycounter}}}{\mytranslations} \tabularnewline
\hline
}%
}%
% Macro showing all translations.
\newcommand{\printtranslations}{%
{% %
\tabulinesep=1.8mm %
\begin{longtabu}{XX} %
\textbf{Original} & \textbf{Translation} \tabularnewline %
\hline %
\showall
\end{longtabu} %
} %
}
\begin{document}
\translation{Bad}{Microsoft Word}
\clearpage
\translation{Good}{TeX}
\translation{Very Good}{LaTeX}%
\clearpage
\clearpage
\printtranslations
\end{document}
第二列后面的附加换行符是longtabu
我目前不理解的一个特性。使用标准时tabular
它不会出现。
答案2
这种方法很难受到Christian Hupfer 的回答其中只使用一个列表,它更接近于原始问题。
在回答这个问题时发现了以下几点:
\ref
需要一个\label
,由此\hyperlink
需要一个\hypertarget
。\phantomsection
与\hyperlink
和一起使用\hypertarget
以获得更好的结果(如在这个答案中描述)。不要让
\hyperlink
-argument 跨越多行代码,因为换行符可能会被识别为链接的一部分。例子:
\hyperlink{ Chap:Translations }
不同于
\hyperlink{Chap:Translations}
使用 \noindent 命令来抑制缩进。
代码:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{tabularx}
\usepackage{forloop}
\def\mytranslations{} %
\newcounter{mytranslationcounter} %
\listadd{\mytranslations}{} %
\newcommand{\translation}[2]{ %
\refstepcounter{mytranslationcounter} %
#2 %
\textsuperscript{\hspace{-0.2cm}( %
\phantomsection\hyperlink{chap:Translations::\number\value{mytranslationcounter}} %
{Translation \number\value{mytranslationcounter}} %
)} %
\listgadd{\mytranslations}{#1 \unexpanded{&} #2} %
}
% Macro showing all translations
\newcounter{seconddummycounter} %
\newcommand{\showtrans}[2]{ %
\stepcounter{seconddummycounter} %
\ifnumequal{\value{seconddummycounter}}{#1}{ %
\noindent\phantomsection\hypertarget{chap:Translations::\number\value{seconddummycounter}}{#2} %
}{} %
} %
\newcounter{mytranslationindex} %
\newcommand{\showtranslations}{ %
\forloop{mytranslationindex}{1} %
{\number\value{mytranslationindex} < \numexpr\number\value{mytranslationcounter}+1}{ %
\setcounter{seconddummycounter}{0} %
\forlistloop{\showtrans{\number\value{mytranslationindex}}}{\mytranslations} \tabularnewline %
} %
} %
\newcommand{\printtranslations}{ %
{ %
\begin{tabularx}{\textwidth}{XX} %
\textbf{Original} & \textbf{Translation} \\ %
\hline %
\showtranslations \\ %
\end{tabularx} %
} %
}
\begin{document}
\newpage
\section{Text}
\translation{Bad}{Microsoft Word}
\clearpage
\translation{Good}{TeX} and \translation{Better}{LaTeX}
\clearpage
\section{Translation}
\printtranslations
\end{document}