我尝试看看是否可以使用 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