使用 TeX 宏存储多个数据

使用 TeX 宏存储多个数据

我正在尝试使用 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\Googlehttp://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}

相关内容