我正在使用xepersian
和lstlisting
包,但在字幕方面遇到了一些问题。
以下是代码:
\documentclass[a4paper,10pt]{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}
\usepackage{xepersian}
\settextfont{Nazli}
%\setlatintextfont{Courier}
\DefaultMathsDigits
\definecolor{customblue}{RGB}{235,241,245}
\definecolor{light-gray}{gray}{0.95}
\lstdefinestyle{C++Style}{%
backgroundcolor=\color{customblue},
breaklines=true,
basicstyle=\footnotesize\ttfamily,
keywordstyle=\color{blue},
commentstyle=\color{OliveGreen}\textit,
stringstyle=\color{red},
numbers=left,
numberstyle={\tiny\lr},
showspaces = false,
showstringspaces = false,
tabsize = 2,
frame=single,
xleftmargin=5pt,
xrightmargin=3pt,
language = C++,
aboveskip = 20pt,
rulecolor=\color{black},
}
\lstnewenvironment{C++Code}
{
\lstset{style=C++Style}
}{}
\def\lstlistingname{برنامه}
\begin{document}
%case 1
\begin{LTR}
\begin{C++Code}[caption=\rl{تابع فلان}]
int main()
{
return 0;
}
\end{C++Code}
\end{LTR}
%case 2
\begin{LTR}
\begin{lstlisting}[style=C++Style,caption=\rl{تابع فلان}]
int main()
{
return 0;
}
\end{lstlisting}
\end{LTR}
\end{document}
在情况 1 中,标题根本没有出现,并且出现编译时警告“列表开始后文本丢失...”
情况 2,标题确实出现了,但方向错误。包括位在内的整个标题\lstlistingname #:
必须从右到左。
我尝试使用类似的东西:
\lstnewenvironment{C++CodeLTR}
{
\LTR
{
% \lstset{style=C++Style}
}
}{}
% \lstset{style=C++Style}
但它不起作用。
PS 顺便说一下,在情况 1 中,该样式也不适用。
PPS 这些话来自列表-xepersian.def能帮助任何人解决问题吗?
\ProvidesFile{listings-xepersian.def}[2014/07/17 v0.3 bilingual captions for listings package]
\def\lstlistingname{\if@RTL برنامهٔ\else Listing\fi}
\def\lstlistlistingname{\if@RTL فهرست برنامهها\else Listings\fi}
\endinput
我认为这可能相关,因为如果我不明确定义lstlistingname
,它的值将等于 Listing。因此条件不满足。
答案1
如果您希望使用可选参数,则需要设置环境以接受该参数。(此问题与排版方向无关。)手册第 42 页有一个示例listings
。
但是,为了正确排版标题,您需要查看手册的第 18 页,其中bidi
专门针对您感兴趣的情况解释了问题及其解决方案,即 RTL 标题(例如通用名称 -> 数字 -> 冒号 -> 特定名称)和 LTR 代码框。为此,bidi
提供了一个附加键listings
,captiondirection
您可以将其设置为以下三个值之一:RTL
、LTR
或textdirection
。由于您需要切换到 LTR 来排版代码,但想要保留标题的 RTL,因此您需要使用它RTL
来覆盖当前的排版方向。
\documentclass[a4paper,10pt]{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{xepersian}
\settextfont{Noto Kufi Arabic}%{PakType Naqsh} http://code.google.com/p/noto/
\DefaultMathsDigits
\definecolor{customblue}{RGB}{235,241,245}
\definecolor{light-gray}{gray}{0.95}
\lstdefinestyle{C++Style}{%
backgroundcolor=\color{customblue},
breaklines=true,
basicstyle=\footnotesize\ttfamily,
keywordstyle=\color{blue},
commentstyle=\color{OliveGreen}\textit,
stringstyle=\color{red},
numbers=left,
numberstyle={\tiny\lr},
showspaces = false,
showstringspaces = false,
tabsize = 2,
frame=single,
xleftmargin=5pt,
xrightmargin=3pt,
language = C++,
aboveskip = 20pt,
rulecolor=\color{black},
captiondirection=RTL,
}
\lstnewenvironment{C++Code}[1][]
{%
\lstset{style=C++Style, #1}%
}{%
}
\def\lstlistingname{برنامه}
\begin{document}
%case 1
\begin{LTR}
\begin{C++Code}[caption={تابع فلان}]
int main()
{
return 0;
}
\end{C++Code}
\end{LTR}
%case 2
\begin{LTR}
\begin{lstlisting}[style=C++Style,caption=\rl{تابع فلان}]
int main()
{
return 0;
}
\end{lstlisting}
\end{LTR}
\end{document}
请注意,这台计算机上没有支持正确脚本且包含冒号的字体,因此下面的框实际上是冒号。
由于这使用caption
,它应该做所有正常的事情,例如添加到列表列表等。