# 更新 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};
,它没有产生令人满意的输出。如上所述,
当使用时
@gobble
,会被“吞噬”,这对于解析代码}
至关重要。tikz
离开了
@gobble
意味着在列表开头有一个奇怪的逗号分隔空项。(但是,请注意\kern0pt
David 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
\@subtitle
titlepage
tikzpicture
结果:
代码:
\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{}
或其他的参数。我不得不使用来自不同问题的代码,因为您没有在这里发布完整的示例。