铸造和不同颜色的指示

铸造和不同颜色的指示

我尝试看看是否可以使用 minted 根据 pragma、omp、acc 后面的内容对 #pragma 语句进行不同的着色。

我知道这一点 使用 minted 在代码列表中突出显示 #pragma 但这不符合我的目的。我对 pygmentize 的工作原理知之甚少,因此任何想法都将不胜感激。

\documentclass{article}
\usepackage{luatex85}
\usepackage{shellesc}
\usepackage{minted}
\newminted{c}{fontsize=\footnotesize,bgcolor=lightgray}

\AtBeginDocument{%
  \let\originalpyg\PYGdefault
  \renewcommand{\PYGdefault}[2]{%
    \ifstrequal{#1}{c+cp}%
     {\IfBeginWith{#2}{\PYGZsh{}pragma}%
       {\originalpyg{#1}{\color{red}{#2}}}%
       {\originalpyg{#1}{#2}}}%
     {\originalpyg{#1}{#2}}%
  }%
}

\begin{document}

\begin{ccode}
#include <stdio.h>
#include <omp.h>
int main (int argc, char *argv[]) {
  #pragma omp parallel
  {
    int tid = omp_get_thread_num();
    printf("Hello from thread %d\n", tid);
  }
  #pragma acc parallel
  {
    printf("Hello from acc\n");
  }
  return 0;
}
\end{ccode}
\end{document}

建造

lualatex -shell-escape color.tex

我已经尝试了显而易见的方法,在 pragma 之后添加 omp,但似乎只有 pragma 被传递给了字符串。

最好将 #pragma omp 和 #pragma acc 设置为不同的颜色

阿林

答案1

这应该能满足您的要求。只需替换序言中现有的内容即可。

\makeatletter
\minted@checkstyle{default}
\let\originalpyg\PYGdefault
\newcommand{\activespace}{\FV@Space}
\renewcommand{\PYGdefault}[2]{%
  \ifstrequal{#1}{c+cp}%
   {\IfBeginWith{#2}{\FancyVerbBreakStart\PYGZsh{}pragma\activespace omp}%
     {\originalpyg{#1}{\color{red}{#2}}}%
     {\IfBeginWith{#2}{\FancyVerbBreakStart\PYGZsh{}pragma\activespace acc}%
       {\originalpyg{#1}{\color{green}{#2}}}%
       {\originalpyg{#1}{#2}}}}%
   {\originalpyg{#1}{#2}}%
}%
\makeatother

旧的链接示例不再适用于 的当前版本minted。而且由于此新代码也破坏了内部结构,因此将来也可能会崩溃。

需要\minted@checkstyle{default}来确保默认样式\PYGdefault存在。在 的最新版本中minted,样式仅在使用前立即在命令/环境中创建,而不是在序言的末尾。 \minted@checkstyle立即强制样式定义。

需要\activespace来使比较识别空格,因为在使用 定义的逐字上下文中空格是被特殊处理的fancyvrb

包会在每个命令\FancyVerbBreakStart的第二个参数开头插入。它使换行成为可能。\PYG<style>fvextra

相关内容