我正在尝试使用 TeX 宏来存储多个数据,例如网站网址/名称。以下是示例:
\documentclass{article}
\def\Google{{http://www.google.com}{Google Search}}
\makeatletter
\newcommand*\WebSiteName[1]{\@WebSiteName\expandafter#1}
\newcommand*\WebSiteUrl[1]{\@WebSiteUrl\expandafter#1}
\newcommand*\@WebSiteName[2]{#2}
\newcommand*\@WebSiteUrl[2]{#1}
\makeatother
\begin{document}
Name : \WebSiteName\Google \par
Url : \WebSiteUrl\Google
\end{document}
在这个例子中,\WebSiteName\Google
应该写“Google Search”,并且\WebSiteUrl\Google
应该写“http://www.google.com”。
但问题\WebSiteName\Google
是http://www.google.comGoogle搜索”。我尝试使用\expandafter
将两个参数合并为一个参数。也许这是错误的方法。
答案1
你放错了地方\expandafter
:它必须走前 \@WebSiteName
和\@WebSiteUrl
。但事实证明这两个辅助宏已经在 LaTeX 内核中了:
\makeatletter
\newcommand{\WebSiteName}{\expandafter\@secondoftwo}
\newcommand{\WebSiteUrl}{\expandafter\@firstoftwo}
\makeatother
\newcommand{\NewSite}[3]{\newcommand#1{{#2}{#3}}}
\NewSite{\Google}{http://www.google.com}{Google Search}
当\WebSiteName\Google
被发现时,它变成
\expandafter\@secondoftwo\Google
然后\Google
展开,得到
\@secondoftwo{http://www.google.com}{Google Search}
最后
Google Search
答案2
谢谢 egreg。
最后,经过一番搜索,我使用了不同的方法,使用了包数据工具。
文件:websites.csv
id, url, name
Google, http://www.google.com, Google Search
文件:document.tex
\documentclass{minimal}
\usepackage{datatool}
% set "," as separator between each entry
% "," is the default
% to use <tab> as separator, use \DTLsettabseparator
\DTLsetseparator{,}
% loads the database
\DTLloaddb{websites}{websites.csv}
\newcommand*\WebSiteName[1]{%
\DTLgetvalueforkey{\temp}{name}{websites}{id}{#1}%
\temp}
\newcommand*\WebSiteUrl[1]{%
\DTLgetvalueforkey{\temp}{url}{websites}{id}{#1}%
\temp}
\newcommand*\WebSite[1]{%
\WebSiteName{#1}~\WebSiteUrl{#1}}
\begin{document}
% show database
\DTLdisplaydb{websites}
\WebSiteName{Google}
\WebSiteUrl{Google}
\WebSite{Google}
\end{document}