I dont think you can do without some manual labour, if you don't have a system of numbering. However you can trick listings
to use other values.
For reference it is the counter lstnumber
which holds the current line number.
So the solution is to do conditional checking with the counter and insert the correct format, or reference.
I have created a macro which collects information on the line number and inserts the correct format upon the line number reached.
% Save the original way of printing the number
\let\othelstnumber=\thelstnumber
\def\createlinenumber#1#2{
\edef\thelstnumber{%
\unexpanded{%
\ifnum#1=\value{lstnumber}\relax
#2%
\else}%
\expandafter\unexpanded\expandafter{\thelstnumber\othelstnumber\fi}%
}
\ifx\othelstnumber=\relax\else
\let\othelstnumber\relax
\fi
}
This macro will consecutively store any information that you wish to replace with the lstnumber
counter.
So calling:
\createlinenumber{105}{3.1}
\createlinenumber{107}{3.1.5}
will globally change lines 105 and 107 to 3.1, 3.1.5, respectively.
Thus the following
\documentclass{article}
\usepackage{listings}
\begin{document}
% Save the original way of printing the number
\let\othelstnumber=\thelstnumber
\def\createlinenumber#1#2{
\edef\thelstnumber{%
\unexpanded{%
\ifnum#1=\value{lstnumber}\relax
#2%
\else}%
\expandafter\unexpanded\expandafter{\thelstnumber\othelstnumber\fi}%
}
\ifx\othelstnumber=\relax\else
\let\othelstnumber\relax
\fi
}
\bgroup
\createlinenumber{105}{3.1}
\createlinenumber{107}{3.1.5}
\begin{lstlisting}[numbers=left,firstnumber=100,numberstyle=\ttfamily]
begin { empty lines }
end; { empty lines }
\end{lstlisting}
\egroup
\end{document}
will produce:
Notice the use of \bgroup
and \egroup
to not being globally changed.
Only manually selected lines
If you do not wish to display any other than yours provided you simply need to tell TeX
to discard those. Notice that you cannot use numbers=none
as that will never execute \thelstnumber
.
Thus the code looks like this:
\def\createlinenumber#1#2{
\edef\thelstnumber{%
\unexpanded{%
\ifnum#1=\value{lstnumber}\relax
#2%
\fi}%
\ifx\thelstnumber\relax\else
\expandafter\unexpanded\expandafter{\thelstnumber}%
\fi
}
}
However the above requires an initialisation before first use. You then have to add: \let\thelstnumber\relax
after the first \bgroup
but before the first execution of \createlinenumber
.
As bonus info. This was originally intended for a friends thesis who would love to have 007
printed on page 7
. Hence I of course used it on \thepage
. :)
I just expanded it to do other things as well.
Solution for XeTeX
I've done it! (I hope) Result is:
Hope this works.
%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass[12pt,letterpaper]{article}
\usepackage{xltxtra}
\usepackage{fullpage}
\usepackage{hyperref}
\usepackage{setspace}
\usepackage{bidipoem}
\usepackage[Kashida]{xepersian}
\settextfont[Scale=1.4]{Scheherazade}
\setlatintextfont[Ligatures=TeX]{Brill}
\newcount\LineNumber \newcount\templinenumber
\newdimen\linenumberskip \linenumberskip=-1em
\chardef\linestep=3
\def\poemlinenumber{%
\advance\LineNumber1
\templinenumber=\LineNumber
\computelinenumber
}
\def\computelinenumber{%
\ifnum\templinenumber>\linestep
\advance\templinenumber-\linestep
\expandafter\computelinenumber
\else
\ifnum\templinenumber=\linestep
\leavevmode\rlap{\kern\linenumberskip\the\LineNumber}%
\fi
\fi
}
\newenvironment{numberedpoem}
{\everypar{\everypar{\poemlinenumber}}%
\begin{traditionalpoem}}
{\end{traditionalpoem}}
\renewcommand{\thepage}{\texorpdfstring{\lr{\arabic{page}}}{\arabic{page}}}
\begin{document}
\begin{latin}
\title{Typesetting sample: \emph{Ghazal no.\ 1} of Ḥāfeẓ}
\author{}
\date{}
\maketitle
\section*{Persian text}
\end{latin}
\vspace{-4.5pc}
\begin{spacing}{1.5}
\begin{numberedpoem}
\\الا یا ایّها الساقی ادر کأسا و ناولها&که عشق آسان نمود اول ولی افتاد مشکلها
\\به بوی نافهای کآخر صبا زان طره بگشاید&ز تاب جعد مشکینش چه خون افتاد در دلها
\\مرا در منزل جانان چه امن عیش چون هر دم&جرس فریاد میدارد که بربندید محملها
\\به می سجاده رنگین کن گرت پیر مغان گوید&که سالک بیخبر نبْوَد ز راه و رسم منزلها
\\شب تاریک و بیم موج و گردابی چنین هایل&کجا دانند حال ما سبکباران ساحلها
\\همه کارم ز خود کامی به بدنامی کشید آخر&نهان کی ماند آن رازی کز او سازند محفلها
\\حضوری گر همیخواهی از او غایب مشو حافظ
\\متی ما تلق من تهوی دع الدنیا و اهملها
\end{numberedpoem}
\end{spacing}
\end{document}
My code does not have much flexibility but might help you. I'm not sure if line numbers are correct. If it is not delete \\
at the first line and add vspace
Solution for pdflatex
Use ledarab
package and \arablnumrep
command.
I don't know Arabic but this look like correct:
%!TEX TS-program = pdflatex
%!TEX encoding = UTF-8 Unicode
\documentclass[11pt,letterpaper]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{fullpage}
\usepackage{arabtex}
\usepackage{verses}
\usepackage{ledmac}
\usepackage{ledarab}
\setstanzaindents{0,0,0}
\lineation{section}
\setcounter{firstlinenum}{3}
\setcounter{linenumincrement}{3}
\setkomafont{disposition}{\rmfamily\mdseries}
\arablnumrep
\begin{document}
\title{Another \d H\=afe\d z \emph{ghazal} example}
\author{}
\date{}
\maketitle
\vspace{-4pc}
\section*{\emph{Ghazal} no.~1}
\beginnumbering
\linenummargin{right}
\pstart
\begin{arabtext} \setfarsi \transfalse \arabtrue \novocalize
\setversedim{70mm}{8mm}
\halfverses{'alA yA ayyuhA as-sAqI 'adir" ka's"aN wa nAwil"hA}{kiH `i^sq AsAn numUd awwal walI uftAd mu^skilhA}
\halfverses{baH bU-ye nAfaH"|I k'A_hir .sabA zAn .turraH bag^sAyad}{zi tAb"e zulf"e mu^skIna^s ^ciH _hUn uftAd dar dilhA}
\halfverses{baH may sajjAdaH rangIn kun garat pIr"e mu.gAn gUyad}{kiH sAlik bI_habar nab"w"ad zi rAH wa rasm"e manzilhA}
\halfverses{marA dar manzil"e jAnAn ^ciH amn"e `ay^s ^cUn har dam}{jaras faryAd mI"|dArad kiH bar bandId ma.hmilhA}
\halfverses{^sab"e tArIk wa bIm"e mawj wa girdAbI ^cunIn hA'il}{kujA dAnand .hAl"e mA sabukbArAn"e sA.hilhA}
\halfverses{hamaH kAram zi _hUdkAmI baH badnAmI ka^sId ArI}{nihAn kay mAnad An rAzI kaz An sAzand ma.hfilhA}
\halfverses{.hu.dUrI gar hamI _hwAhI azU .gA'ib ma^saw .hAfi.z}{matY mA talq"a man tahwY da`"a ad-dunyA wa 'ahmil"hA}
\end{arabtext} \transtrue \arabfalse
\pend
\endnumbering
\end{document}
Best Answer
lineno
ends up numbering some internal boxes thatamsmath
uses for positioning the alignmnent. Not extensively tested but this modifieslineno
to check it isn't numbering a zero sized box.