如何在 LaTeX 中自动创建标签和参考文献?

如何在 LaTeX 中自动创建标签和参考文献?

我定义了两个自定义宏:

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

相关内容