我正在嘗試使用lstlisting
一些自訂格式的 Python 程式碼。問題是有些單字被識別為關鍵字,儘管我不希望它們如此。我嘗試使用該命令deletekeywords
但沒有成功。
以下是重現我的問題的 mcve tex 文件:單字apply
和hash
將以藍色顯示,這是分配給關鍵字的顏色。
\documentclass[12pt, letterpaper]{article}
\usepackage{listings}
\usepackage[dvipsnames,table,xcdraw]{xcolor}
\begin{document}
\lstset{language=Python,
tabsize=4,
%frame=lines,
caption={Python function to split between train and test sets.},
label={lst:code_direct},
literate={~} {$\sim$}{1},
backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}
basicstyle=\footnotesize, % the size of the fonts that are used for the code
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
%breaklines=true, % sets automatic line breaking
captionpos=b, % sets the caption-position to bottom
commentstyle=\color{gray}\textit, % comment style
% deletekeywords={hash}, % if you want to delete keywords from the given language
escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, not work with UTF-8
frame=tb, % adds a frame around the code
keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
keywordstyle=\color{blue}\bfseries, % keyword style
language=Python, % the language of the code (can be overrided per snippet)
%otherkeywords={*,...}, % if you want to add more keywords to the set
numbers=left, % where to put the line-numbers; possible values are (none, left, right)
numbersep=5pt, % how far the line-numbers are from the code
numberstyle=\tiny\color{gray}, % the style that is used for the line-numbers
rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
showstringspaces=false, % underline spaces within strings only
showtabs=false, % show tabs within strings adding particular underscores
stepnumber=1, % the step between two line-numbers. If it's 1, each line will be numbered
stringstyle=\ttb\color{red}, % string literal style
tabsize=2, % sets default tabsize to 2 spaces
title=\lstname, % show the filename of files included with \lstinputlisting; also try caption instead of title
columns=fixed, % Using fixed column width (for e.g. nice alignment)
emph ={split_train_test_by_id, test_set_check},
emphstyle=\color{red},
morekeywords={split_train_test_by_id}
deletekeywords={hash,apply}
}
\begin{lstlisting}
def split_train_test_by_id(data, test_ratio, id_column,
hash=hashlib.md5):
ids = data[id_column];
in_test_set = ids.apply(lambda _id: test_set_check(_id,
test_ratio, hash));
return data.loc[~in_test_set], data.loc[in_test_set];
# The check on the id is to see the value of the last byte
# If this value is less then test_ratio*256 (assuming uniform
# distribution)
# then will return true otherwise false. The fraction of true
# will be equal to test_ratio
def test_set_check(identifier, test_ratio, hash):
limit = test_ratio*256; #1byte
#digest will calculate the hash value
res = hash(np.int64(identifier)).digest()[-1];
return res<limit;
\end{lstlisting}
\end{document}
答案1
該文件lstlang1.sty
(使用命令kpsewhich lstlang1.sty
查找它)包含listings
.關鍵字定義為兩組:
morekeywords={access, and, break, class, continue, def, del, elif, else,%
except, exec, finally, for, from, global, if, import, in, is, lambda,%
not, or, pass, print, raise, return, try, while},%
% Built-ins
morekeywords=[2]{abs, all, any, basestring, bin, bool, bytearray,%
callable, chr, classmethod, cmp, compile, complex, delattr, dict, dir,%
divmod, enumerate, eval, execfile, file, filter, float, format,%
frozenset, getattr, globals, hasattr, hash, help, hex, id, input, int,%
isinstance, issubclass, iter, len, list, locals, long, map, max,%
memoryview, min, next, object, oct, open, ord, pow, property, range,%
raw_input, reduce, reload, repr, reversed, round, set, setattr, slice,%
sorted, staticmethod, str, sum, super, tuple, type, unichr, unicode,%
vars, xrange, zip, apply, buffer, coerce, intern},%
和apply
關鍵字hash
位於第二組。要刪除它們,您必須使用:
deletekeywords=[2]{hash,apply},
這是您更正後的 MWE(末尾有一個逗號每個鑰匙):
\documentclass[12pt, letterpaper]{article}
\usepackage{listings}
\usepackage[dvipsnames,table,xcdraw]{xcolor}
\begin{document}
\lstset{language=Python,
tabsize=4,
%frame=lines,
caption={Python function to split between train and test sets.},
label={lst:code_direct},
literate={~} {$\sim$}{1},
backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}
basicstyle=\footnotesize, % the size of the fonts that are used for the code
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
%breaklines=true, % sets automatic line breaking
captionpos=b, % sets the caption-position to bottom
commentstyle=\color{gray}\textit, % comment style
% deletekeywords={hash}, % if you want to delete keywords from the given language
escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, not work with UTF-8
frame=tb, % adds a frame around the code
keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
keywordstyle=\color{blue}\bfseries, % keyword style
language=Python, % the language of the code (can be overrided per snippet)
%otherkeywords={*,...}, % if you want to add more keywords to the set
numbers=left, % where to put the line-numbers; possible values are (none, left, right)
numbersep=5pt, % how far the line-numbers are from the code
numberstyle=\tiny\color{gray}, % the style that is used for the line-numbers
rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
showstringspaces=false, % underline spaces within strings only
showtabs=false, % show tabs within strings adding particular underscores
stepnumber=1, % the step between two line-numbers. If it's 1, each line will be numbered
stringstyle=\ttb\color{red}, % string literal style
tabsize=2, % sets default tabsize to 2 spaces
title=\lstname, % show the filename of files included with \lstinputlisting; also try caption instead of title
columns=fixed, % Using fixed column width (for e.g. nice alignment)
emph ={split_train_test_by_id, test_set_check},
emphstyle=\color{red},
morekeywords={split_train_test_by_id}, % comma added!
deletekeywords=[2]{hash,apply}, % [2] and comma added!
}
\begin{lstlisting}
def split_train_test_by_id(data, test_ratio, id_column,
hash=hashlib.md5):
ids = data[id_column];
in_test_set = ids.apply(lambda _id: test_set_check(_id,
test_ratio, hash));
return data.loc[~in_test_set], data.loc[in_test_set];
# The check on the id is to see the value of the last byte
# If this value is less then test_ratio*256 (assuming uniform
# distribution)
# then will return true otherwise false. The fraction of true
# will be equal to test_ratio
def test_set_check(identifier, test_ratio, hash):
limit = test_ratio*256; #1byte
#digest will calculate the hash value
res = hash(np.int64(identifier)).digest()[-1];
return res<limit;
\end{lstlisting}
\end{document}
答案2
好吧,我想我知道你的問題是。您認為「deletekeywords」會刪除預先定義的關鍵字,但實際上是從您在「morekeywords」中建立的自訂清單中刪除關鍵字。
不幸的是,唯一對我有用的就是使用你已經擁有的東西從頭開始為 Python 定義一個自訂樣式。然後,您應該在“morekeywords”中手動新增您想要的關鍵字。
\lstdefinestyle{pythoncode}{
language={}, %You shall leave this blank
tabsize=4,
caption={Python function to split between train and test sets.},
label={lst:code_direct},
literate={~} {$\sim$}{1},
backgroundcolor=\color{white},
basicstyle=\footnotesize,
breakatwhitespace=false,
captionpos=b,
morecomment=[l]{##},
commentstyle=\color{gray}\textit,
escapeinside={\%*}{*)},
extendedchars=true,
frame=tb,
keepspaces=true,
keywordstyle=\color{blue}\bfseries,
morekeywords={return,def,apply,lambda}, %New keywords
numbers=left,
numbersep=5pt,
numberstyle=\tiny\color{gray},
rulecolor=\color{black},
showspaces=false,
showstringspaces=false,
showtabs=false,
stepnumber=1,
stringstyle=\ttb\color{red},
tabsize=2,
title=\lstname,
columns=fixed,
emph ={split_train_test_by_id, test_set_check},
emphstyle=\color{red}}
然後,要使用這種樣式,請使用
\begin{lstlisting}[style=pythoncode]
**Your Python Code here**
\end{lstlisting}
它可能不是最好的,但當有人提出更好的答案時,它應該可以解決問題。