更新 2015-03-12 寻找更好的答案

更新 2015-03-12 寻找更好的答案

# 更新 2015-03-19 找到更好的答案

这个问题是一系列问题的一部分。我的目标是在节点内使用此列表tikz,但为了保持简单,我从之前的问题中删除了它。在此过程中,我遇到了后期处理和的问题tikz。所以,对于那些感兴趣的人,以下是供参考的快速列表

要制作一个可以处理解析后输入列表项的宏,请参阅:

有关制作可以处理解析后输入列表项的宏的相关问题,请参阅:


更新 2015-03-12 寻找更好的答案

这个问题,虽然我接受了答案,但从来没有让我满意的答案,因为答案是不,无法将 aux 中的列表插入到 tikz 节点中,因为 @gobble 会吞掉最后一个}在第一次运行期间吞噬了最后一个。或许将来有人会得出另一个结论。我只能希望如此……

问题

这是另一个问题的延伸,因为另一个问题的答案虽然正确回答了问题,但却未能解决\maketitle使用自定义命令的问题tikz

我如何循环遍历 \maketitle 之后的输入列表,并将该列表用作 \maketitle 命令的一部分?

问题

代码排版不可靠。它会正确排版,直到你犯了一个错误,然后会导致:

Argument of \@gobble has an extra }.


问题澄清 更新日期 2015-03-18

问题在于\tikz \node {\manuallanguages};,它没有产生令人满意的输出。如上所述,

  1. 当使用时@gobble,会被“吞噬”,这对于解析代码}至关重要。tikz

  2. 离开了@gobble意味着在列表开头有一个奇怪的逗号分隔空项。(但是,请注意\kern0ptDavid Carlisle 提供的答案,它解决了这个问题。

基于的超简约代码大卫·卡莱尔的回答

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\makeatletter
\let\@title\@empty
\let\@subtitle\@empty
\newcommand\subtitle[1]{%
  \gdef\@subtitle{#1}}
\newcommand{\manuallanguages}{} % initialization
\newcommand{\inputlanguagefile}[3]{%
%  #1 is unneeded for this minimal example
%  #2 is used elsewhere and unneeded for this minimal example
  \protected@write\@auxout{}{\string\used@language{#1}}
}%
\newcommand{\language@sep}{\ifnum\lastnodetype=12 \else, \fi}% list separator (does not use unless >1 item)
\newcommand{\used@language}[1]{%
  \g@addto@macro\manuallanguages{\language@sep{#1}}% add items to list
}%
\makeatother
\begin{document}
    \tikz[overlay,remember picture]\node [color=red,draw,dashed,inner sep=1cm,font=\bfseries] at (current page.center) {\kern0pt \manuallanguages};
  \inputlanguagefile{En}{English}{en} %<- En added to list
  \inputlanguagefile{Da}{Dansk}{da} %<- Da added to list
  \inputlanguagefile{De}{Deutsch}{de} %<- Da added to list
\end{document}

试图

以下代码基于 egreg 对原始问题

它似乎不可靠:只要犯一个错误和排版,它就无法再编译。我明白Argument of \@gobble has an extra }.这可能与有关tikz,因为当我把 #1 和 #2 变量\maketitle放入节点时,我遇到了问题。因为有时即使在这些条件下也会排版,所以我不是真的确定问题是什么。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\makeatletter 
\newcommand{\manuallanguages}{\@gobble} % initialization
\newcommand{\inputlanguagefile}[3]{%
  \input{#3}% File to input
  %#2 is used elsewhere and unneeded for this minimal example
  \@namedef{language@#1}{#1}% Creates new command language@En for example (if I understand correctly)
  \protected@write\@auxout{}{\string\used@language{}#1}% Calls \used@language command to generate list saved as string to aux
}
\AtEndDocument{\let\used@language\@gobble}% What is this doing?
\newcommand{\language@sep}{, }% list separator (does not use unless >1 item)
\newcommand{\used@language}[1]{%
  \g@addto@macro\manuallanguages{\language@sep{#1}}% add items to list
}
\makeatother

\renewcommand{\maketitle}[2]{%
\begin{tikzpicture}[overlay,remember picture]
\node [font=\Huge] (title) at ($ (current page.north)!.25!(current page.south) $) {#1};
\node [font=\Large, below=of title] (subtitle) {#2};
\end{tikzpicture}
%#1
%#2
\thispagestyle{empty}
\setcounter{page}{0}
\clearpage
}

\begin{document}

\maketitle[\manuallanguages]{User Manuals}

\inputlanguagefile{En}{English}{./en.tex}
\inputlanguagefile{Da}{Dansk}{./da.tex}
\inputlanguagefile{Da}{Deutsch}{./de.tex}

\end{document}

答案1

我不确定我是否理解这个问题或当前答案的问题,但这个版本没有初始化列表,\@gobble这似乎是主要的反对意见。

\documentclass{article}
\usepackage{tikz,lipsum}
\usetikzlibrary{calc,positioning}
\makeatletter
\let\@title\@empty
\let\@subtitle\@empty
\newcommand\subtitle[1]{%
  \gdef\@subtitle{#1}}
\renewcommand\maketitle{%
  \begin{titlepage}%
    \begin{tikzpicture}[overlay,remember picture]
      \node [font=\Huge] (title) at ($ (current page.north)!.25!(current page.south) $) {\@title};
      \node [font=\Large, below=of title] (subtitle) {\kern0pt \@subtitle{}};
    \end{tikzpicture}
  \end{titlepage}%
}
\newcommand{\manuallanguages}{} % initialization
\newcommand{\inputlanguagefile}[3]{%
  \input{#3}% File to input
  %#2 is used elsewhere and unneeded for this minimal example
  \protected@write\@auxout{}{\string\used@language{#1}}% Calls \used@language command to generate list saved as string to aux
}

\newcommand{\language@sep}{\ifnum\lastnodetype=12 \else, \fi}% list separator (does not use unless >1 item)
\newcommand{\used@language}[1]{%
  \g@addto@macro\manuallanguages{\language@sep{#1}}% add items to list
}
\makeatother
\begin{filecontents}{de.tex}
  \title{de}
  \subtitle{Gebrauchsanweisung}
  \maketitle
  \section{Test}
  \lipsum[50]
\end{filecontents}
\begin{filecontents}{da.tex}
  \title{da}
  \subtitle{Brugsanvisning}
  \maketitle
  \section{Test}
  \lipsum[50]
\end{filecontents}
\begin{filecontents}{en.tex}
  \title{en}
  \subtitle{User Manual}
  \maketitle
  \section{Test}
  \lipsum[50]
\end{filecontents}

\begin{document}

  \title{User Manuals}
  \subtitle{\manuallanguages}
  \maketitle

  \inputlanguagefile{En}{English}{en}
  \inputlanguagefile{Da}{Dansk}{da}
  \inputlanguagefile{Da}{Deutsch}{de}

\end{document}

答案2

编辑

与原始代码不同,这在首次排版时不会产生编译错误。它也不依赖于包titling

我定义\subtitle{}\@subtitle来处理字幕。titlepage在重新定义中用于\maketitle创建实际的标题页。由于我们重新定义了\maketitle,我们可以多次发出等。我们还可以使用和访问标题和字幕\maketitle。它们在环境中用于将当前值传递到。\title\@title\@subtitletitlepagetikzpicture

结果:

用户手册

代码:

\documentclass{article}
\usepackage{tikz,lipsum}
\usetikzlibrary{calc,positioning}
\makeatletter
\let\@title\@empty
\let\@subtitle\@empty
\newcommand\subtitle[1]{%
  \gdef\@subtitle{#1}}
\renewcommand\maketitle{%
  \begin{titlepage}%
    \begin{tikzpicture}[overlay,remember picture]
      \node [font=\Huge] (title) at ($ (current page.north)!.25!(current page.south) $) {\@title};
      \node [font=\Large, below=of title] (subtitle) {\@subtitle{}};
    \end{tikzpicture}
  \end{titlepage}%
}
\newcommand{\manuallanguages}{\@gobble} % initialization
\newcommand{\inputlanguagefile}[3]{%
  \input{#3}% File to input
  %#2 is used elsewhere and unneeded for this minimal example
  \protected@write\@auxout{}{\string\used@language{#1}}% Calls \used@language command to generate list saved as string to aux
}
\AtEndDocument{\let\used@language\@gobble}% What is this doing?
\newcommand{\language@sep}{, }% list separator (does not use unless >1 item)
\newcommand{\used@language}[1]{%
  \g@addto@macro\manuallanguages{\language@sep{#1}}% add items to list
}
\makeatother
\begin{filecontents}{de.tex}
  \title{de}
  \subtitle{Gebrauchsanweisung}
  \maketitle
  \section{Test}
  \lipsum[50]
\end{filecontents}
\begin{filecontents}{da.tex}
  \title{da}
  \subtitle{Brugsanvisning}
  \maketitle
  \section{Test}
  \lipsum[50]
\end{filecontents}
\begin{filecontents}{en.tex}
  \title{en}
  \subtitle{User Manual}
  \maketitle
  \section{Test}
  \lipsum[50]
\end{filecontents}

\begin{document}

  \title{User Manuals}
  \subtitle{\manuallanguages}
  \maketitle

  \inputlanguagefile{En}{English}{en}
  \inputlanguagefile{Da}{Dansk}{da}
  \inputlanguagefile{Da}{Deutsch}{de}

\end{document}

请注意,据我所知,这符合您的意图,但由于不同问题中的语法并不总是匹配,我不得不猜测,但我不确定我是否正确。然而,这应该只是一个问题,例如反转给予\title{}\subtitle{}或其他的参数。我不得不使用来自不同问题的代码,因为您没有在这里发布完整的示例。

相关内容