使用自定义宏创建的 LaTeX 表格数组中的错误文本

使用自定义宏创建的 LaTeX 表格数组中的错误文本

我有一个tabular基于 David Carlisle 的回答的数组 在编译期间生成 LaTeX 表格代码。我修改了代码,以便在不同的\newcommand命令定义(实际上是列表)中定义列和行。\regionlist包含大脑区域{ABC,DEF,GHI}\contrastlist包含“对比”或活动{SLEEP,RUN,SPEAK}。这些是在中定义的g_loc_contrast_tabular_def.tex。单元格的数据是g_loc_contrast_def.tex使用\def宏定义定义的,数组的每个数据单元格都有一个宏定义tabular,但不包括顶行和最左边的列。

因此,这个特定的数组包含不同情况下局部神经活动的数据,情况在行上,大脑区域在列上,数据由宏定义,例如\def\locBABCcontrastSLEEP{both ABCs during sleep}。这些定义工作正常。

g_loc_contrast_def.tex我添加了代码来将行标题替换为使用\def宏(\contrastdescSLEEP\contrastdescRUN、 )定义的描述\contrastdescSPEAK,但我无法正确获得视觉输出。在最左边的列中,我想要“沉睡“ 在第一行数据(第二行)上,”跑马拉松“ 在第二行数据(第三行)上,以及“请讲“(全部带有大胆的,不带引号),但我得到了LEEP深度睡眠“,”联合国马拉松 RRUN“ 和 ”PEAK 演讲 SSPEAK“(不带引号)。字符串RUNSLEEPSPEAK用于宏名称中,当我最终找到一种使用 来获取数组中的描述的方法时,包含行代码的字符串\textbf{\newcommand\contrastdesc#1{\csname contrastdesc#1\endcsname} \contrastdesc#1}%的首字母( 、或)被移动到描述字符串的右侧,连同完整的行代码字符串。所以我试图找出我的 LaTeX 代码出了什么问题,以获得正确的输出。#1SLEEPRUNSPEAK

我对 LaTeX 宏完全是新手,所以这可能只是一些基本的错误。我曾尝试找到解决方案并理解 LaTeX 宏系统,但我认为我仍然只理解了一点点。

通过使用 ,代码可以毫无问题地进行编译latexmk --pdf main.tex

\documentclass[12pt]{article}

\usepackage[american]{babel}
\usepackage{graphicx}

\begin{filecontents}{g_loc_contrast_tabular_def}
\newcommand\regionlist{ABC,DEF,GHI}
\newcommand\contrastlist{SLEEP,RUN,SPEAK}

% listheadings.
\def\listheadings{%
\expandafter\xlistheadings\regionlist,\relax,}

% xlistheadings.
\def\xlistheadings#1,{%
\ifx\relax#1%
\expandafter\\\hline
\else
&\textbf{#1}%
\expandafter\xlistheadings
\fi}

% listbody.
\def\listbody{%
\expandafter\xlistbody\contrastlist,\relax,}

% xlistbody.
\def\xlistbody#1,{%
\ifx\relax#1%
\else
\textbf{\newcommand\contrastdesc#1{\csname contrastdesc#1\endcsname}
\contrastdesc#1}%
\gdef\thisrow{#1}
\expandafter\xlistdata\regionlist,\relax,%
\expandafter\hline
\expandafter\xlistbody
\fi}

% xlistdata.
\def\xlistdata#1,{%
\ifx\relax#1%
\expandafter\\
\else
&\csname locB#1contrast\thisrow\endcsname
\expandafter\xlistdata
\fi}

% preamble.
\def\preamble{\expandafter\xpreamble\regionlist,\relax,}
\def\xpreamble#1,{%
\ifx\relax#1%
\else
c%
\expandafter\xpreamble
\fi}

% tablestart.
\def\tablestart{%
\edef\temp{\noexpand\begin{tabular}{c\preamble}\noexpand\hline}%
    \temp}
\end{filecontents}

\begin{filecontents}{g_loc_contrast_def}
\def\locBABCcontrastSLEEP{ both ABCs during sleeping }
\def\locBABCcontrastRUN{ both ABCs during running }
\def\locBABCcontrastSPEAK{ both ABCs during speaking }

\def\locBDEFcontrastSLEEP{ both DEFs during sleeping }
\def\locBDEFcontrastRUN{ both DEFs during running } 
\def\locBDEFcontrastSPEAK{ both DEFs during speaking }

\def\locBGHIcontrastSLEEP{ both GHIs during sleeping }
\def\locBGHIcontrastRUN{ both GHIs during running } 
\def\locBGHIcontrastSPEAK{ both GHIs during speaking }

\def\contrastdescSLEEP{ deep sleep }
\def\contrastdescRUN{ running marathon }
\def\contrastdescSPEAK{ speaking }
\end{filecontents}

\begin{filecontents}{g_loc_contrast_tabular}
\tiny
\begin{table}
\scalebox{0.7}{
\tablestart
\listheadings
\listbody
\end{tabular}
} % end scalebox
\caption{Caption goes here.}
\begin{enumerate}
    \item Item number one. 
    \item Item number two.
\end{enumerate}
\end{table}
\normalsize
\end{filecontents}

\input{g_loc_contrast_tabular_def}
\input{g_loc_contrast_def}

\begin{document}

\input{g_loc_contrast_tabular}

\end{document}

答案1

我想你只是想要

\def\xlistbody#1,{%
\ifx\relax#1%
\else
\textbf{\csname contrastdesc#1\endcsname}%
\gdef\thisrow{#1}
\expandafter\xlistdata\regionlist,\relax,%
\expandafter\hline
\expandafter\xlistbody
\fi}

在此处输入图片描述

相关内容