我正在尝试使用表格列中的文本数据作为绘图中的刻度标签。文本数据包含下划线,这会导致 LaTeX 抛出错误Missing $ inserted
。我通常会通过加载包来解决这个问题underscore
,如果我使用 明确提供刻度标签列表,那么这种方法就没问题xticklabels={A_B,B_C}
。但是,当我使用xticklabels from table={<table name>}{<column name>}
语法时,下划线不会被打印出来,我Missing $
再次收到错误。
我查看了该xticklabels from table
选项的作用,基本上它只是读取指定的表列,将内容写入列表,然后使用以下宏为每个刻度解压该列表:
\makeatletter
\def\pgfplots@user@ticklabel@list@x{%
\pgfplotslistselectorempty\ticknum\of\pgfplots@xticklabels\to\tick
\tick
}
\makeatother
\pgfplots@xticklabels
是存储标签的列表,它\tick
只是一个宏,用于保存单个刻度的标签文本。使用\show\tick
该宏显示它实际上只保存纯文本:
> \tick=macro:
->A_B.
现在通常情况下,这应该可以正常工作。如果我说\def\testtext{_}
,然后使用另一个宏(例如)打印该文本\def\printtest{\testtext} \printtest
,下划线就会出现。
如何在指定的刻度标签中使用下划线,xticklabels from table
而不必用替换数据表中的下划线\_
?
\documentclass{article}
\usepackage{underscore}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
%% For your convenience: This is the unaltered macro that prints
%% the tick label when "xticklabels from table" is used
\makeatletter
\def\pgfplots@user@ticklabel@list@x{%
\pgfplotslistselectorempty\ticknum\of\pgfplots@xticklabels\to\tick
\tick
}
\makeatother
\pgfplotstableread{
Label Value_A
A_B 1
B_C 2
}\datatable
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xtick=data,
% xticklabels={A_B,B_C}, % <- this works
xticklabels from table={\datatable}{Label} % <- this doesn't
]
\addplot table[x expr=\coordindex]{\datatable};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
_
您认为这是一个有效的答案吗?我现在无法真正测试它,而且它太长了,无法发表评论。这个想法是“在我们读取数据时禁用数学模式功能”。
\catcode`\_=12 % category other
\pgfplotstableread{
Label Value
A_B 1
B_C 2
}\datatable
\catcode`\_=8 % category subscript
答案2
这是表格读取命令的补丁:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{etoolbox}
% \usepackage{underscore} % load if explicit underscores have to be used
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\makeatletter
% Patch the command that precedes reading the table
\patchcmd{\pgfplotstablereadpreparecatcodes@}
{\pgfplotstableinstallignorechars}
{\catcode`\_=13 \begingroup\lccode`~=`_
\lowercase{\endgroup\let~}\textunderscore
\pgfplotstableinstallignorechars}
{}{}
% Patch the command that restores the category codes
\patchcmd{\pgfplotstablereadpreparecatcodes}
{\noexpand}
{\catcode\string`\noexpand\_=\the\catcode\string`\_ \noexpand}
{}{}
\makeatother
%% For your convenience: This is the unaltered macro that prints
%% the tick label when "xticklabels from table" is used
\makeatletter
\def\pgfplots@user@ticklabel@list@x{%
\pgfplotslistselectorempty\ticknum\of\pgfplots@xticklabels\to\tick
\tick
}
\makeatother
\pgfplotstableread{
Label Value
A_B 1
B_C 2
}\datatable
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xtick=data,
%xticklabels={A_B,B_C}, % <- this works with package underscore
xticklabels from table={\datatable}{Label} % <- this works
]
\addplot table[x expr=\coordindex]{\datatable};
\end{axis}
\end{tikzpicture}
\end{document}
获得独立于输出编码的真正下划线的唯一方法是使_
active 和 等效于\textunderscore
。示例使用T1
,但也使用 运行OT1
。