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}
아마도 최고는 아닐 수도 있지만 누군가가 더 나은 답변을 제공하는 동안 트릭을 수행해야 합니다.