嗯,我正在用 LaTeX 做 Arduino 课程的笔记,我正在阅读有关该listings
软件包的信息,我想将其与课程练习的代码一起使用。我知道 Arduino 使用一种基于 Processing 的语言,而这种语言尚未包含在可以识别的语言中listings
。
所以,我的问题是是否有办法配置或设置listings
来为 Arduino 创建代码块,并且可以使用印刷或配色方案来区分注释、变量、定义等。
我的 MWE:
\documentclass[fontsize=10pt,paper=letter,DIV=8]{scrartcl}
\usepackage{typearea}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{mwe}
\usepackage{listings}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.47,0.47,0.33}
\definecolor{myorange}{rgb}{0.8,0.4,0}
\definecolor{mywhite}{rgb}{0.98,0.98,0.98}
\definecolor{myblue}{rgb}{0.01,0.61,0.98}
\lstset{ %
backgroundcolor=\color{mywhite},
basicstyle=\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
commentstyle=\color{mygray},
deletekeywords={...},
escapeinside={\%*}{*)},
extendedchars=true,
frame=shadowbox,
keepspaces=true,
keywordstyle=\color{myorange},
language=Octave,
morekeywords={*,...},
numbers=left,
numbersep=5pt,
numberstyle=\tiny\color{mygray},
rulecolor=\color{black},
rulesepcolor=\color{myblue},
showspaces=false,
showstringspaces=false,
showtabs=false,
stepnumber=2,
stringstyle=\color{myorange},
tabsize=2,
title=\lstname
}
\begin{document}
\section{Introduction}
\blindtext
\begin{figure}
\includegraphics[width=0.48\linewidth]{example-image}
\caption{Arduino UNO diagram.}
\end{figure}
\newpage
\section{First programs}
\minisec{Sketch 1: A flashing LED on a protoboard}
\begin{lstlisting}
/*
Sketch un led intermitente en una tarjeta de pruebas.
Es practicamente lo mismo que un Hello World.
En este caso cambiamos el pin del LED y usamos un LED externo, ademas del LED hay que colocar un resistor entre el LED y tierra.
*/
void setup(){
//inicializa el pin digital 9 como salida (output)
pinMode(9,OUTPUT);
}
void loop(){
digitalWrite(9,HIGH); //pone el LED en HIGH (encendido)
delay(1000); // espera por un segundo, 1000 ms
digitalWrite(9,LOW); // pone el LED en LOW (apagado)
delay(1000); // espera por un segundo, 1000 ms
}
\end{lstlisting}
\end{document}
我得到了一个带有彩色阴影的漂亮框架,但我还想获得代码中的颜色。
答案1
您只需提供该语言的定义:
你可以调整很多东西,但为了说明我所做的更改如下:
- 注释(
/* ... */
和单行//
都是红色的, - 关键词突出显示
myorange
, - 标识符(手动指定)以蓝色粗体突出显示
- 数字(不在注释中)以绿色突出显示。如果您也希望注释中的数字突出显示,请
*
删除literate=*
。
参考:
代码:
\documentclass[fontsize=10pt,paper=letter,DIV=8]{scrartcl}
\usepackage{typearea}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{mwe}
\usepackage{listings}
\usepackage{etoolbox}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.47,0.47,0.33}
\definecolor{myorange}{rgb}{0.8,0.4,0}
\definecolor{mywhite}{rgb}{0.98,0.98,0.98}
\definecolor{myblue}{rgb}{0.01,0.61,0.98}
\newcommand*{\FormatDigit}[1]{\ttfamily\textcolor{mygreen}{#1}}
%% https://tex.stackexchange.com/questions/32174/listings-package-how-can-i-format-all-numbers
\lstdefinestyle{FormattedNumber}{%
literate=*{0}{{\FormatDigit{0}}}{1}%
{1}{{\FormatDigit{1}}}{1}%
{2}{{\FormatDigit{2}}}{1}%
{3}{{\FormatDigit{3}}}{1}%
{4}{{\FormatDigit{4}}}{1}%
{5}{{\FormatDigit{5}}}{1}%
{6}{{\FormatDigit{6}}}{1}%
{7}{{\FormatDigit{7}}}{1}%
{8}{{\FormatDigit{8}}}{1}%
{9}{{\FormatDigit{9}}}{1}%
{.0}{{\FormatDigit{.0}}}{2}% Following is to ensure that only periods
{.1}{{\FormatDigit{.1}}}{2}% followed by a digit are changed.
{.2}{{\FormatDigit{.2}}}{2}%
{.3}{{\FormatDigit{.3}}}{2}%
{.4}{{\FormatDigit{.4}}}{2}%
{.5}{{\FormatDigit{.5}}}{2}%
{.6}{{\FormatDigit{.6}}}{2}%
{.7}{{\FormatDigit{.7}}}{2}%
{.8}{{\FormatDigit{.8}}}{2}%
{.9}{{\FormatDigit{.9}}}{2}%
%{,}{{\FormatDigit{,}}{1}% depends if you want the "," in color
{\ }{{ }}{1}% handle the space
,%
}
\lstset{%
backgroundcolor=\color{mywhite},
basicstyle=\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
commentstyle=\color{red},
deletekeywords={...},
escapeinside={\%*}{*)},
extendedchars=true,
frame=shadowbox,
keepspaces=true,
keywordstyle=\color{myorange},
language=Octave,
morekeywords={*,...},
numbers=left,
numbersep=5pt,
numberstyle=\tiny\color{mygray},
rulecolor=\color{black},
rulesepcolor=\color{myblue},
showspaces=false,
showstringspaces=false,
showtabs=false,
stepnumber=2,
stringstyle=\color{myorange},
tabsize=2,
title=\lstname,
emphstyle=\bfseries\color{blue},% style for emph={}
}
%% language specific settings:
\lstdefinestyle{Arduino}{%
style=FormattedNumber,
keywords={void},% define keywords
morecomment=[l]{//},% treat // as comments
morecomment=[s]{/*}{*/},% define /* ... */ comments
emph={HIGH, OUTPUT, LOW},% keywords to emphasize
}
\newtoggle{InString}{}% Keep track of if we are within a string
\togglefalse{InString}% Assume not initally in string
\begin{document}
\section{Introduction}
\blindtext
\begin{figure}
\includegraphics[width=0.48\linewidth]{example-image}
\caption{Arduino UNO diagram.}
\end{figure}
\newpage
\section{First programs}
\minisec{Sketch 1: A flashing LED on a protoboard}
\begin{lstlisting}[style=Arduino]
/*
Sketch un led intermitente en una tarjeta de pruebas.
Es practicamente lo mismo que un Hello World.
En este caso cambiamos el pin del LED y usamos un LED externo, ademas del LED hay que colocar un resistor entre el LED y tierra.
*/
void setup(){
//inicializa el pin digital 9 como salida (output)
pinMode(9,OUTPUT);
}
void loop(){
digitalWrite(9,HIGH); //pone el LED en HIGH (encendido)
delay(1000); // espera por un segundo, 1000 ms
digitalWrite(9,LOW); // pone el LED en LOW (apagado)
delay(1000); // espera por un segundo, 1000 ms
}
\end{lstlisting}
\end{document}
答案2
这里'列表保存到外部文件,该文件添加 Arduino 作为一种语言,并正确突出显示所有内置类型和功能。
将arduinoLanguage.tex
文件放在您的工作目录中(您正在处理的 LaTeX 文件旁边)。要将其添加到您的项目中,请放置:
\input{arduinoLanguage.tex}
\begin{document}
在你的 LaTeX 文件之前的某个地方。
在您的文档中,将 Arduino 代码放在以下位置:
\begin{lstlisting}[language=Arduino]
%% arduino code here %%
\end{lstlisting}
或者创建自己的风格来进行更改,例如添加非内置函数和变量:
\lstdefinestyle{myArduino}{
language=Arduino,
%% make listing changes here %%
}
并将您的 Arduino 代码放在以下位置:
\begin{lstlisting}[style=myArduino]
%% arduino code here %%
\end{lstlisting}
arduinoLanguage.tex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% ~ Arduino Language - Arduino IDE Colors ~ %%%
%%% %%%
%%% Kyle Rocha-Brownell | 10/2/2017 | No Licence %%%
%%% -------------------------------------------------------------------------- %%%
%%% %%%
%%% Place this file in your working directory (next to the latex file you're %%%
%%% working on). To add it to your project, place: %%%
%%% \input{arduinoLanguage.tex} %%%
%%% somewhere before \begin{document} in your latex file. %%%
%%% %%%
%%% In your document, place your arduino code between: %%%
%%% \begin{lstlisting}[language=Arduino] %%%
%%% and: %%%
%%% \end{lstlisting} %%%
%%% %%%
%%% Or create your own style to add non-built-in functions and variables. %%%
%%% %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{color}
\usepackage{listings}
\usepackage{courier}
%%% Define Custom IDE Colors %%%
\definecolor{arduinoGreen} {rgb} {0.17, 0.43, 0.01}
\definecolor{arduinoGrey} {rgb} {0.47, 0.47, 0.33}
\definecolor{arduinoOrange} {rgb} {0.8 , 0.4 , 0 }
\definecolor{arduinoBlue} {rgb} {0.01, 0.61, 0.98}
\definecolor{arduinoDarkBlue} {rgb} {0.0 , 0.2 , 0.5 }
%%% Define Arduino Language %%%
\lstdefinelanguage{Arduino}{
language=C++, % begin with default C++ settings
%
%
%%% Keyword Color Group 1 %%% (called KEYWORD3 by arduino)
keywordstyle=\color{arduinoGreen},
deletekeywords={ % remove all arduino keywords that might be in c++
break, case, override, final, continue, default, do, else, for,
if, return, goto, switch, throw, try, while, setup, loop, export,
not, or, and, xor, include, define, elif, else, error, if, ifdef,
ifndef, pragma, warning,
HIGH, LOW, INPUT, INPUT_PULLUP, OUTPUT, DEC, BIN, HEX, OCT, PI,
HALF_PI, TWO_PI, LSBFIRST, MSBFIRST, CHANGE, FALLING, RISING,
DEFAULT, EXTERNAL, INTERNAL, INTERNAL1V1, INTERNAL2V56, LED_BUILTIN,
LED_BUILTIN_RX, LED_BUILTIN_TX, DIGITAL_MESSAGE, FIRMATA_STRING,
ANALOG_MESSAGE, REPORT_DIGITAL, REPORT_ANALOG, SET_PIN_MODE,
SYSTEM_RESET, SYSEX_START, auto, int8_t, int16_t, int32_t, int64_t,
uint8_t, uint16_t, uint32_t, uint64_t, char16_t, char32_t, operator,
enum, delete, bool, boolean, byte, char, const, false, float, double,
null, NULL, int, long, new, private, protected, public, short,
signed, static, volatile, String, void, true, unsigned, word, array,
sizeof, dynamic_cast, typedef, const_cast, struct, static_cast, union,
friend, extern, class, reinterpret_cast, register, explicit, inline,
_Bool, complex, _Complex, _Imaginary, atomic_bool, atomic_char,
atomic_schar, atomic_uchar, atomic_short, atomic_ushort, atomic_int,
atomic_uint, atomic_long, atomic_ulong, atomic_llong, atomic_ullong,
virtual, PROGMEM,
Serial, Serial1, Serial2, Serial3, SerialUSB, Keyboard, Mouse,
abs, acos, asin, atan, atan2, ceil, constrain, cos, degrees, exp,
floor, log, map, max, min, radians, random, randomSeed, round, sin,
sq, sqrt, tan, pow, bitRead, bitWrite, bitSet, bitClear, bit,
highByte, lowByte, analogReference, analogRead,
analogReadResolution, analogWrite, analogWriteResolution,
attachInterrupt, detachInterrupt, digitalPinToInterrupt, delay,
delayMicroseconds, digitalWrite, digitalRead, interrupts, millis,
micros, noInterrupts, noTone, pinMode, pulseIn, pulseInLong, shiftIn,
shiftOut, tone, yield, Stream, begin, end, peek, read, print,
println, available, availableForWrite, flush, setTimeout, find,
findUntil, parseInt, parseFloat, readBytes, readBytesUntil, readString,
readStringUntil, trim, toUpperCase, toLowerCase, charAt, compareTo,
concat, endsWith, startsWith, equals, equalsIgnoreCase, getBytes,
indexOf, lastIndexOf, length, replace, setCharAt, substring,
toCharArray, toInt, press, release, releaseAll, accept, click, move,
isPressed, isAlphaNumeric, isAlpha, isAscii, isWhitespace, isControl,
isDigit, isGraph, isLowerCase, isPrintable, isPunct, isSpace,
isUpperCase, isHexadecimalDigit,
},
morekeywords={ % add arduino structures to group 1
break, case, override, final, continue, default, do, else, for,
if, return, goto, switch, throw, try, while, setup, loop, export,
not, or, and, xor, include, define, elif, else, error, if, ifdef,
ifndef, pragma, warning,
},
%
%
%%% Keyword Color Group 2 %%% (called LITERAL1 by arduino)
keywordstyle=[2]\color{arduinoBlue},
keywords=[2]{ % add variables and dataTypes as 2nd group
HIGH, LOW, INPUT, INPUT_PULLUP, OUTPUT, DEC, BIN, HEX, OCT, PI,
HALF_PI, TWO_PI, LSBFIRST, MSBFIRST, CHANGE, FALLING, RISING,
DEFAULT, EXTERNAL, INTERNAL, INTERNAL1V1, INTERNAL2V56, LED_BUILTIN,
LED_BUILTIN_RX, LED_BUILTIN_TX, DIGITAL_MESSAGE, FIRMATA_STRING,
ANALOG_MESSAGE, REPORT_DIGITAL, REPORT_ANALOG, SET_PIN_MODE,
SYSTEM_RESET, SYSEX_START, auto, int8_t, int16_t, int32_t, int64_t,
uint8_t, uint16_t, uint32_t, uint64_t, char16_t, char32_t, operator,
enum, delete, bool, boolean, byte, char, const, false, float, double,
null, NULL, int, long, new, private, protected, public, short,
signed, static, volatile, String, void, true, unsigned, word, array,
sizeof, dynamic_cast, typedef, const_cast, struct, static_cast, union,
friend, extern, class, reinterpret_cast, register, explicit, inline,
_Bool, complex, _Complex, _Imaginary, atomic_bool, atomic_char,
atomic_schar, atomic_uchar, atomic_short, atomic_ushort, atomic_int,
atomic_uint, atomic_long, atomic_ulong, atomic_llong, atomic_ullong,
virtual, PROGMEM,
},
%
%
%%% Keyword Color Group 3 %%% (called KEYWORD1 by arduino)
keywordstyle=[3]\bfseries\color{arduinoOrange},
keywords=[3]{ % add built-in functions as a 3rd group
Serial, Serial1, Serial2, Serial3, SerialUSB, Keyboard, Mouse,
},
%
%
%%% Keyword Color Group 4 %%% (called KEYWORD2 by arduino)
keywordstyle=[4]\color{arduinoOrange},
keywords=[4]{ % add more built-in functions as a 4th group
abs, acos, asin, atan, atan2, ceil, constrain, cos, degrees, exp,
floor, log, map, max, min, radians, random, randomSeed, round, sin,
sq, sqrt, tan, pow, bitRead, bitWrite, bitSet, bitClear, bit,
highByte, lowByte, analogReference, analogRead,
analogReadResolution, analogWrite, analogWriteResolution,
attachInterrupt, detachInterrupt, digitalPinToInterrupt, delay,
delayMicroseconds, digitalWrite, digitalRead, interrupts, millis,
micros, noInterrupts, noTone, pinMode, pulseIn, pulseInLong, shiftIn,
shiftOut, tone, yield, Stream, begin, end, peek, read, print,
println, available, availableForWrite, flush, setTimeout, find,
findUntil, parseInt, parseFloat, readBytes, readBytesUntil, readString,
readStringUntil, trim, toUpperCase, toLowerCase, charAt, compareTo,
concat, endsWith, startsWith, equals, equalsIgnoreCase, getBytes,
indexOf, lastIndexOf, length, replace, setCharAt, substring,
toCharArray, toInt, press, release, releaseAll, accept, click, move,
isPressed, isAlphaNumeric, isAlpha, isAscii, isWhitespace, isControl,
isDigit, isGraph, isLowerCase, isPrintable, isPunct, isSpace,
isUpperCase, isHexadecimalDigit,
},
%
%
%%% Set Other Colors %%%
stringstyle=\color{arduinoDarkBlue},
commentstyle=\color{arduinoGrey},
%
%
%%%% Line Numbering %%%%
numbers=left,
numbersep=5pt,
numberstyle=\color{arduinoGrey},
%stepnumber=2, % show every 2 line numbers
%
%
%%%% Code Box Style %%%%
breaklines=true, % wordwrapping
tabsize=2,
basicstyle=\ttfamily
}