允许在从表中读取的 PGFPlots 刻度标签中使用下划线

允许在从表中读取的 PGFPlots 刻度标签中使用下划线

我正在尝试使用表格列中的文本数据作为绘图中的刻度标签。文本数据包含下划线,这会导致 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

在此处输入图片描述

相关内容