针对字体系列进行测试

针对字体系列进行测试

根据列表 - 对普通注释 /* 和 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}

由于某些未知的原因,它也会删除空格,但这不是主要问题。

了解 Doxygen 注释

如果我们想在 pragma delimiter 中突出显示其他内容,则可能会出现类似的问题

moredelim=[l][\color{red}]{\#pragma},

或者在普通字符串和注释内。

答案1

我的第二个解决方案并不完全是我想要的。

我应该检查我是否在我的 moredelim 中。相反,我检查了特定于该 moredelim 的字体属性。

针对字体系列进行测试

  1. 我让 Doxygen 注释成为唯一使用\sffamily

    moredelim=[s][\color{ForestGreen}\sffamily]{/**}{*/},%doxygen 注释

  2. 在规则内部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}

在此处输入图片描述

问题

  1. 我不想将 Doxygen Comments 用作\sffamily。我希望它们保持\ttfamily与代码的其余部分一样。我宁愿针对 moredelim 或字体颜色等独特属性(示例中为 ForestGreen)进行测试

  2. 我仍然遇到多余空格的问题。使用上述解决方案,我在普通注释或字符串中得到了多余空格。如果我从解决方案中删除空格,则在\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}

在此处输入图片描述

相关内容