根据列表 - 对普通注释 /* 和 doxygen 注释 /** 使用不同的样式
我使用listings
包来设置/** Doxygen comments */
用户定义的分隔符的样式
moredelim = [s][\color{ForestGreen}]{/**}{*/}
这个自己的分隔符应该包含自己的“关键字”,这些关键字不应与已处理的语言关键字混淆。这样的“关键字”可以是 Doxygen 对 C++ 代码的注释:
- C++ 关键字不应在 Doxygen 分隔符 /** 内
/** */
突出
显示@作者int */ - Doxygen“关键字”不应在 Doxygen 分隔符
@author之外突出显示整数
文件 test.tex 还测试字符串、注释和其他自己的分隔符。
\begin{MyCode}
/**
* @author HERE
* @param HERE
* @return HERE
* int float void not_here
*/
int main(void) {
float f = @param + @return + not_here;
string s = "@param @return not here";
int @author = not_here;
return 0;
}
#pragma not here @param @return
/* @author @param not here */
\end{MyCode}
使用literate
突出显示注释到处。
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[svgnames]{xcolor}
\usepackage[scaled=0.84]{beramono}
\usepackage{listings}
\lstnewenvironment{MyCode}
{\lstset{language=C++,
literate={@param}{\bfseries @param}1
{@return}{\bfseries @return}1
{@author}{\bfseries @author}1,
basicstyle=\ttfamily,
keywordstyle=\bfseries,
identifierstyle=\color{blue},
stringstyle=\color{magenta},
commentstyle=\color{olive},
moredelim=[s][\color{ForestGreen}]{/**}{*/},
moredelim=[l][\color{red}]{\#pragma},
frame=single,showstringspaces = false,columns=flexible}
}{}
\begin{document}
\input{test}
\end{document}
由于某些未知的原因,它也会删除空格,但这不是主要问题。
如果我们想在 pragma delimiter 中突出显示其他内容,则可能会出现类似的问题
moredelim=[l][\color{red}]{\#pragma},
或者在普通字符串和注释内。
答案1
我的第二个解决方案并不完全是我想要的。
我应该检查我是否在我的 moredelim 中。相反,我检查了特定于该 moredelim 的字体属性。
针对字体系列进行测试
我让 Doxygen 注释成为唯一使用
\sffamily
moredelim=[s][\color{ForestGreen}\sffamily]{/**}{*/},%doxygen 注释
在规则内部
literate
,我使用条件反对\sffamily
完整示例
文档
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[svgnames]{xcolor}
\usepackage[scaled=0.84]{beramono}
\usepackage{listings}
\usepackage{pdftexcmds}
\makeatletter
\newcommand{\MyBoldSf}[1]{%
\ifnum\pdf@strcmp{\f@family}{\sfdefault}=\z@%
{\color{green!30!black}\bfseries #1 }%extra space
\else%
#1 %extra space
\fi%
}%
\makeatother
\lstnewenvironment{MyCode}
{\lstset{language=C++,
literate={@param}{\MyBoldSf{@param}}1
{@return}{\MyBoldSf{@return}}1
{@author}{\MyBoldSf{@author}}1,
basicstyle=\ttfamily,
keywordstyle=\bfseries,
%identifierstyle=\color{blue},
stringstyle=\color{magenta},
commentstyle=\color{olive},
moredelim=[s][\color{ForestGreen}\sffamily]{/**}{*/}, %doxygen comment
moredelim=[l][\color{red}]{\#pragma}, %preprocessor
frame=single,showstringspaces = false,columns=flexible}
}{}
\begin{document}
\input{test}
\end{document}
测试.tex
\begin{MyCode}
/**
* @author HERE
* @param HERE
* @return HERE
* int float void not_here
*/
int main(void) {
float f = @param + @return + not_here;
string s = "@param @return not here";
int @author = not_here;
return 0;
}
#pragma not here @param @return
/*@author @param not here */
\end{MyCode}
问题
我不想将 Doxygen Comments 用作
\sffamily
。我希望它们保持\ttfamily
与代码的其余部分一样。我宁愿针对 moredelim 或字体颜色等独特属性(示例中为 ForestGreen)进行测试我仍然遇到多余空格的问题。使用上述解决方案,我在普通注释或字符串中得到了多余空格。如果我从解决方案中删除空格,则在
\MyBoldSf
使用命令时不会得到空格。
针对字体颜色进行测试
我问过一个问题以字体颜色为条件。根据给出的答案,我编写了命令来用特定颜色更改测试
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[svgnames]{xcolor}
\usepackage[scaled=0.84]{beramono}
\usepackage{listings}
\makeatletter
\newcommand{\MyChange}[2]{%
\extractcolorspec{.}\MyChange@CurrentColor
\extractcolorspec{#2}\MyChange@TestColor
\ifx\MyChange@CurrentColor\MyChange@TestColor
{\bfseries\color{green!33!black} #1 }%
\else
{#1 }%
\fi%
}
\makeatother
\lstnewenvironment{MyCode}
{\lstset{language=C++,
literate={@param}{\MyChange{@param}{ForestGreen}}1
{@return}{\MyChange{@return}{ForestGreen}}1
{@author}{\MyChange{@author}{ForestGreen}}1,
basicstyle=\ttfamily,
keywordstyle=\bfseries,
identifierstyle=\color{blue},
stringstyle=\color{magenta},
commentstyle=\color{olive},
moredelim=[s][\color{ForestGreen}]{/**}{*/}, %doxygen comment
moredelim=[l][\color{red}]{\#pragma}, %preprocessor
frame=single,showstringspaces = false,columns=flexible}
}{}
\begin{document}
\input{test2}
\end{document}
其中 test2.tex
\begin{MyCode}
/**
* @author BOLD HERE
* @param BOLD HERE
* @return BOLD HERE
* int float void not_here
*/
int main(void) {
float f = @param + @return + here_not_bold;
string s = "@param @return here not bold";
int @author = here_not_bold;
return 0;
}
#pragma not here @param @return
/*@author @param not here */
#pragma omp parallel private(id)
\end{MyCode}
针对字体颜色进行测试(更通用)
命令MyChange
可用于替换不同颜色的单词
例如,可以为#pragma delim 添加特殊词
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[svgnames]{xcolor}
\usepackage[scaled=0.84]{beramono}
\usepackage{listings}
\makeatletter
\newcommand{\MyChange}[3]{%
\extractcolorspec{.}\MyChange@CurrentColor
\extractcolorspec{#2}\MyChange@TestColor
\ifx\MyChange@CurrentColor\MyChange@TestColor
{\bfseries\color{#3} #1}%
\else
{#1}%
\fi%
}
\makeatother
\lstnewenvironment{MyCode}
{\lstset{language=C++,
literate={@param}{\MyChange{@param}{ForestGreen}{green!33!black} }1
{@return}{\MyChange{@return}{ForestGreen}{green!33!black} }1
{@author}{\MyChange{@author}{ForestGreen}{green!33!black} }1
{omp}{\MyChange{omp}{red}{red!66!black} }1
{parallel}{\MyChange{parallel}{red}{red!66!black} }1
{private}{\MyChange{private}{red}{red!66!black} }1,
basicstyle=\ttfamily,
keywordstyle=\bfseries,
identifierstyle=\color{blue},
stringstyle=\color{magenta},
commentstyle=\color{olive},
moredelim=[s][\color{ForestGreen}]{/**}{*/}, %doxygen comment
moredelim=[l][\color{red}]{\#pragma}, %preprocessor
frame=single,showstringspaces = false,columns=flexible}
}{}
\begin{document}
\input{test2}
\end{document}
对于相同的 test2.tex 我得到
答案2
我在 Doxygen 中格式化注释的第一个解决方案不是自动的。它需要手动编辑源代码。
在定义时,MyCode
我设置escapechar
为启用所需单词的格式
\lstnewenvironment{MyCode}
{\lstset{language=C++,
escapechar=~,
...
}{}
内部MyCode
粘贴的源代码通过格式手动扩展
\begin{MyCode}
~\bfseries{}\ttfamily{}@param~
\end{MyCode}
完整示例
主文档包含用于突出显示的doc.tex
命令的定义\DoxAnno
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[svgnames]{xcolor}
\usepackage[scaled=0.84]{beramono}
\usepackage{listings}
\newcommand{\DoxAnno}[1]{\ttfamily{\bfseries{\textcolor{green!33!black}{#1}}}} %Doxygen Annotation
\lstnewenvironment{MyCode}
{\lstset{language=C++,
escapechar=~,
basicstyle=\ttfamily,
keywordstyle=\bfseries,
identifierstyle=\color{blue},
stringstyle=\color{magenta},
commentstyle=\color{olive},
moredelim=[s][\color{ForestGreen}]{/**}{*/}, %doxygen comment
moredelim=[l][\color{red}]{\#pragma}, %preprocessor
frame=single,showstringspaces = false,columns=flexible}
}{}
\begin{document}
\input{testEscape}
\end{document}
测试Escape.tex
\begin{MyCode}
/**
* ~\DoxAnno{@author}~ HERE
* ~\DoxAnno{@param}~ HERE
* ~\DoxAnno{@return}~ HERE
* int float void not_here
*/
int main(void) {
float f = @param + @return + not_here;
string s = "@param @return not here";
int @author = not_here;
return 0;
}
#pragma not here @param @return
/* @author @param not here */
\end{MyCode}