Skip to content
Snippets Groups Projects
Commit d27cef09 authored by Olabarrieta Palacios, Ignacio's avatar Olabarrieta Palacios, Ignacio
Browse files

Document folderwq

parent 8a02af66
No related branches found
No related tags found
No related merge requests found
@article{Tang_Ishwaran,
title={Random Forest Missing Data Algorithms},
author={Fei Tang and Hemant Ishwaran},
journal={Stat Anal Data Min.},
volume={10},
number={6},
pages={363--377},
year={2017},
http={https://arxiv.org/pdf/1701.05305.pdf}
}
@article{rf,
title={Random Forest},
author={Leo Breiman},
journal={Stat Anal Data Min.},
volume={45},
number={1},
pages={5--32},
year={2001},
issn={0885-6125}
http={https://www.stat.berkeley.edu/~breiman/randomforest2001.pdf}
}
@article{knn-imputation,
title={Nearest neighbor imputation algorithms: a critical evaluation},
author={Lorenzo Beretta, Alessandro Santaniello},
year={2016},
page={74},
volume={16},
number={3},
journal={BMC medical informatics and decision making},
http={https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4959387/}
}
@thesis{rf-imputation,
title={Imputation for Random Forests},
author={Joshua Young},
year={2017},
university={Utah State University},
http={https://digitalcommons.usu.edu/cgi/viewcontent.cgi?article=1946&context=gradreports}
}
@misc{UCI-repositorio ,
author = "Dua, Dheeru and Graff, Casey",
year = "2017",
title = "{UCI} Machine Learning Repository",
url = "http://archive.ics.uci.edu/ml",
institution = "University of California, Irvine, School of Information and Computer Sciences" }
@article{missForest,
title={MissForest—non-parametric missing value imputation for mixed-type data},
author={Daniel J. Stekhoven, Peter Bühlmann},
journal={Bioinformatics},
volume={28},
number={1},
year={2012},
pages={112--118},
http={https://doi.org/10.1093/bioinformatics/btr597}
}
doc/images/airfoil4pane.png

111 KiB

doc/images/error.png

105 KiB

doc/images/int_state_traffic4pane.png

105 KiB

doc/images/outTests.png

71.8 KiB

doc/images/real_state4pane.png

120 KiB

doc/images/rf_insts.png

40.4 KiB

doc/images/sin4panel.png

122 KiB

doc/images/sizes.png

87.1 KiB

doc/images/wine4pane.png

110 KiB

\documentclass[preprint,12pt]{elsarticle}
\usepackage{subfigure}
\usepackage{makeidx} % allows for indexgeneration
\usepackage{multirow}
\usepackage{tabularx}
\usepackage{amsmath,amsfonts,amssymb}
\usepackage{multirow,array}
\usepackage{graphicx}
\usepackage{rotating}
\usepackage{MnSymbol,wasysym}
\usepackage{url,soul}
\usepackage[switch]{lineno}
\usepackage{blindtext}
\usepackage{comment}
\graphicspath{ {./images/} }
\journal{Transportation Research Part C: Emerging Technologies}
\begin{document}
\begin{frontmatter}
\title{Hole Resilient Method for Classification and Regression}
\author[TECNALIA]{Ignacio (I\~{n}aki) Olabarrieta}
\address[TECNALIA]{OPTIMA Unit. TECNALIA, ICT Division P. Tecnologico Bizkaia, Ed. 700, 48160 Derio, Spain}
%\address[EHU]{Dept. of Communications Engineering. University of the Basque Country UPV/EHU. Alameda Urquijo S/N, 48013 Bilbao, Spain}
%\address[BCAM]{Basque Center for Applied Mathematics (BCAM), 48009 Bilbao, Spain}
\cortext[cor1]{Corresponding author: ignacio.olabarrieta@tecnalia.com. OPTIMA Unit. TECNALIA. P. Tecnologico Bizkaia, Ed. 700, 48160 Derio, Spain. Tl: +34 946 430 50. Fax: +34 901 760 009. E-mail: ignacio.olabarrieta@tecnalia.com.}
\begin{abstract}
\end{abstract}
\begin{keyword}
Time Series forecasting; missing data
\end{keyword}
\end{frontmatter}
\section{Introduction}
Here we propose an extension of the Random Forest Regression \cite{rf} algorithm to consider holes in the data series. In \cite{Tang_Ishwaran} it is shown a
Typically the way to confront the missing values problem is to impute or to fill the missing values by artificial ones~\cite{rf-imputation} in such a way that the regression/classification algorithm can work on all the data set. Popular imputation methods are:
\begin{itemize}
\item Filling missing data with zeroes.
\item Filling missing data with the average values of each feature.
\item Filling missing data via {\it{k}}-Nearest Neighbours algorithm~\cite{knn-imputation}.
\item Filling missing data with the result of missForest~\cite{missForest}.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section {Description}\label {sec:description}
Given a training sample
${\mathcal{D}}_n=\{({\mathbf{X}}_i,Y_i)\}_{i=1}^n$
of
$ \mathbb R^{p}\times \mathbb R$
-valued independent random variables distributed as the independent prototype pair
$ (\mathbf {X} ,Y)$, where
$ \operatorname {E} [Y^{2}]<\infty $. We aim at predicting the responses $Y_j$, associated with the vectors $ {\cal P}_m=\left\{\mathbf {X}_j\right\}_{j=1}^m$.
For a given training sample $\mathcal{D}_n$ and a vector $\mathbf{X}_j$ we compute the prediction $Y_j$ using:
\begin{equation}
Y_j = \mathcal{RF}\left[\mathcal{D}_n \right]\left(\mathbf{X}_j \right).
\end{equation}
\subsection{Mask vectors Properties}
We assume that both the training data ${\mathcal{D}}_n$ and the prediction data $\mathcal{P}_m$ contain holes, missing data $\varnothing$. To define the positions where data are missing we define a mask vector $\mathbf M=\mathcal{M}\left(\mathbf{X}\right)$ for each vector $\mathbf X$, the components of this mask vector are defined as:
\begin{equation}
M^j=\left\{
\begin{array}{cc}
1 & {\mathrm {if}}\ X^j\ \mathrm{is\ \varnothing}\\
0 & {\mathrm {else.}}
\end{array}
\right.
\end{equation}
the hamming weight of $\mathbf M$ is defined as the number of ones within the mask vector: $w_{h}\left(\mathbf{M}\right)=\sum M^j$ as the number of {\it ones} within the mask vector $\mathbf M$.
Therefore each of the vectors $ \mathbf {X}$ has an associated mask vector $\mathcal {M}\left(\mathbf{X}\right)$ depending on the values that are missing on that particular vector. Alternatively each different mask vector $\mathbf {M}_k$ has a set of associated $\mathbf X$ vectors: $\{\mathbf {X}_{}\}$. The number of possible different mask vectors depends on $p$, the size of vectors $\mathbf X$.
For any given mask vector ${\mathbf M}$ there exists a set of mask vectors ${\mathbf C}_{\mathbf M}=\{{\mathbf M}_{l}\}$ which are compatible with ${\mathbf M}$. We say that ${\mathbf M}_{l}$ is compatible with ${\mathbf M}$, and write:
\begin{equation}
{\mathbf M}_{l} \subset {\mathbf M}
\end{equation}
if the all the positions of the {\it ones} in $\mathbf M_{l}$ are in the positions of some (or all) the ones in $\mathbf M$.
\begin{equation}
{\mathbf C}_{\mathbf M} \equiv \left\{{\mathbf M}_k\ :\ {\mathbf M}_k \subset {\mathbf M}\right\}
\end{equation}
For example for ${\mathbf M} = \left[ 0, 0, 1, 1, 0, 0 \right]$
the set of compatible vectors $\mathbf{C_{\mathbf M}}$ is the following:
\begin{equation}
\mathbf{C_{\mathbf M}}=\left\{\left[ 0, 0, 0, 0, 0, 0 \right],\left[ 0, 0, 1, 0, 0, 0 \right],\left[ 0, 0, 0, 1, 0, 0 \right],\left[ 0, 0, 1, 1, 0, 0 \right] \right\}.
\end{equation}
The mask vector with no ones, i.e. $[0, 0, 0, \dots, 0, 0]$, is compatible with all other mask vectors but the only one that is compatible with it is itself. In general if ${\mathbf A} \subset {\mathbf B}$ then ${\mathbf B} \nsubset {\mathbf A}$, more over if
${\mathbf A} \subset {\mathbf B}$ and ${\mathbf B} \subset {\mathbf A}$ then ${\mathbf A}={\mathbf B}$.
In addition, for a given mask vector $\mathbf M$ we can construct the set of mask vectors for which $\mathbf M$ is compatible to, i.e.:
\begin{equation}
{\mathbf C}^{\dagger}_{\mathbf M} \equiv \left\{{\mathbf M}_k\ :\ {\mathbf M} \subset {\mathbf M}_k\right\}
\end{equation}
For example for ${\mathbf M} = \left[ 0, 0, 1, 1, 0, 0 \right]$
the set of compatible vectors $\mathbf{C}^\dagger_{\mathbf M}$ is the following:
\begin{eqnarray}
\nonumber
{\mathbf C}^\dagger_{\mathbf M}=\left\{ \right.
&&\left[ 0, 0, 1, 1, 0, 0 \right],\\
\nonumber
&&\left[ 1, 0, 1, 1, 0, 0 \right],
\left[ 0, 1, 1, 1, 0, 0 \right],
\left[ 0, 0, 1, 1, 1, 0 \right],
\left[ 0, 0, 1, 1, 0, 1 \right],\\
\nonumber
&&\left[ 1, 1, 1, 1, 0, 0 \right],
\left[ 0, 1, 1, 1, 1, 0 \right],
\left[ 0, 0, 1, 1, 1, 1 \right],\\
\nonumber
&&\left[ 1, 1, 1, 1, 1, 0 \right],
\left[ 1, 1, 1, 1, 0, 1 \right],
\left[ 1, 0, 1, 1, 1, 1 \right],
\left[ 0, 1, 1, 1, 1, 1 \right],\\
&&\left. \left[ 1, 1, 1, 1, 1, 1 \right]
\right\}
\end{eqnarray}
\subsection{Generation of Models}
Each mask vector $\mathbf M$ defines a projection function in the following way:
\begin{eqnarray}
\nonumber
{\mathbf M}:{\mathbb R}^p &\longrightarrow& {\mathbb R}^{p-w_h(\mathbf{M})}\\
{\mathbf X} &\mapsto& \pi_{\mathbf M}\left({\mathbf X}\right) = \left[ X_j\right]\ \forall j : M_j = 0
\end{eqnarray}
For example, a vector ${\mathbf X} =[x_1, x_2, x_3,\dots,x_n]$ in $\mathbb R^n$ applying the projection $\pi_{\mathbf M}$ with $w_h(\mathbf{M})=1$ associated with mask vector ${\mathbf M} = [0, 1, 0,\dots,0]$ results in a vector $\pi_{\mathbf M}\left(\mathbf X \right) = [x_1,x_3,\dots,x_n]$ in $\mathbb R^{n-1}$, i.e. the second component of vector $\mathbf X$ has been removed.
For a given vector $\mathbf X$ for which a prediction $Y$ needs to be computed a model is generated taking into account the vectors in ${\cal D}_n$ that have a mask compatible with the mask of the $\mathbf X$, $\mathbf M=\mathcal M\left(\mathbf{X}\right)$.
\begin{equation}
{\mathfrak{D}}\left({\mathbf M;\mathcal{D}_n} \right)=\{(\pi_{\mathbf M}\left(\mathbf{X}_i\right),Y_i)\ \ \ :\ \ \left({\mathbf X}_i,Y_i \right) \in {\mathcal D}_n \ \& \ {\mathcal M}\left({\mathbf X}_i\right) \in {\mathbf C}_{\mathbf M}\ \& \ Y_i \neq {\varnothing} \}
\end{equation}
This training set constitutes a training set without missing data and can be used in order to train a Random Forest model ${\mathcal {RF}}\left[\mathfrak{D}\left(\mathbf{M};\mathcal{D}_n\right)\right]$. Actually any mask vector $\mathbf M^k$ belonging to ${\mathbf C}^\dagger_{\mathbf M}$ can produce a training data set $\mathfrak{D}\left(\mathbf{M}^k;\mathcal{D}_n\right)$ without holes able to generate a model to get a prediction for $\mathbf X$. It is important to note that the information from all these models are not necessarily independent.
There exists multiple ways to combine the results from the different models:
\begin{itemize}
\item One way is to choose the model with higher number of features which coincides with the training set $\mathfrak D\left(\mathbf{M};\mathcal D_n\right)$ and disregard any other model.
\begin{equation}
Y = \mathcal{RF}\left[\mathfrak{D}\right]\left(\mathbf{X}\right)
\end{equation}
This model is the model without holes with more features but it is also the model with less rows available from the training data set. We will denote this method Random Forest Selection level 1.
\item The result of all the models could be average out to obtain an overall result.
\begin{equation}
Y = \frac{1}{|\mathbf{C}^\dagger_{\mathcal{M}\left(\mathbf{X} \right)}|}\sum_k\mathcal{RF}\left[\mathfrak{D}\left(\mathbf{M}^k;\mathcal {D}_n\right)\right]\left(\mathbf{X}\right) \ \forall \mathbf{M}^k \in \mathbf{C}^\dagger_{\mathcal{M}\left(\mathbf{X} \right)}
\end{equation}
\item Only consider the model with most features, i.e. model derived from $\mathcal {M}(\mathbf{X})$ and the models with one less features. We will denote this method Random Forest selection with 2 levels.
\begin{equation}
Y = \frac{1}{\mathcal N}\sum_k\mathcal{RF}\left[\mathfrak{D}\left(\mathbf{M}^k;\mathcal {D}_n\right)\right]\left(\mathbf{X}\right)\ :\ \mathbf{M}^k \in \mathbf{C}^\dagger_{\mathcal{M}\left(\mathbf{X} \right)}\ \ \& \ \
w_{h}\left(\mathbf{M}^k\right) \leq w_{h}\left(\mathcal{M}\left(\mathbf{X}\right)\right)+1
\end{equation}
where $\mathcal N$ is the number of $\mathbf{M}^k$ with $w_h$ equal or less than $w_h(\mathcal{M}(\mathbf{X}))+1$.
\item Finally, the last method to combine the different models is to perform {\it stacking}. For a given $\mathbf X$ for which a prediction is requested a meta Random Forest model is used. This meta model is constructed using as the training samples the predictions obtained from the individual models constructed using $\mathbf{M}^k \in \mathbf{C}^\dagger_{\mathcal{M}\left(\mathbf X \right)}$.
\begin{equation}
Y = \mathcal{RF}\left[ \mathfrak{M}\right]\left(\mathcal{Y}\right)
\end{equation}
where $\mathcal{Y}$ is the vector with components:
\begin{equation}
\mathcal{Y}^k = \mathcal{RF}\left[\mathfrak{D}\left(\mathbf{M}^k;\mathcal {D}_n\right)\right]\left(\mathbf{X}\right)
\end{equation}
and $\mathfrak{M}$ is the training set associated with these vectors and obtained from $\mathcal{D}_n$.
\end{itemize}
\section{Results}\label {sec:results}
\subsection{$Sin\left(x\right)$ Prediction}
We have tested the different method in predicting the result of $\sin\left(x\right)$. In order to construct a training sample $\mathcal{D}_n$ and a test sample $\mathcal{P}_m$. We choose $1000$ values of $\sin\left(x\right)$ starting from $x=0$ and $0.01$ apart. Holes are produced with according to different $P_r$ probabilities using MCAR (missing completely at random) mechanism, this way, the probability of getting missing data at a particular position is independent of other values.
The string of values obtained is divided in sets of 6 values: the first 5 constitute the $\mathbf{X}^j$ vectors, therefore $p=5$ and the sixth one $Y^j$. A string of $10000$ values produces $9995$ tuples, the difference due to boundary issues, that are furthermore randomly split $75$\%-$25$\% to finally produce $\mathcal{D}_n$ and $\mathcal{P}_m$.
Different methods have been applied in order to overcome the missing data.
\begin{itemize}
\item \textbf{Interp(0)}: Filling the missing data interpolating the missing data with the average value for each feature, in this case since it has been derived from values of $\sin\left(x\right)$ the average value of all the features is $0$.
\item \textbf{Interp(const)}: Filling the missing data with the average values with in a given vector $\mathbf{X}$.
\item \textbf{Interp(linear)}: Filling the missing data with a linear approximation within each vector $\mathbf{X}$.
\item \textbf{KNN}: Using a KNN method for interpolating the missing values.
\item \textbf{MissForest}: \textit{ MissForest imputes missing values using Random Forests in an iterative fashion [1]. By default, the imputer begins imputing missing values of the column (which is expected to be a variable) with the smallest number of missing values -- let's call this the candidate column. The first step involves filling any missing values of the remaining, non-candidate, columns with an initial guess, which is the column mean for columns representing numerical variables. From https://pypi.org/project/missingpy/}
\item There \textbf{Random Forest Selection} methods described in section \ref{sec:description}. Including the level 1, level 2 y and the stacking method using a meta Random Forest model.
\end{itemize}
%\includegraphics[scale=0.35]{outTests.png}
\begin{figure}
\includegraphics[scale=0.3]{error.png}
\caption{Mean Square Error for the different methods investigated.}
\label{fig:mse}
\end{figure}
For each of the methods and value for the probability of missing data $10$ simulations have been performed and shown in Figure \ref{fig:mse}.
The results for the mean square error are shown in Figure \ref{fig:mse}. We can see that the best of the methods is to use a simple linear interpolation within each of the vectors $\mathbf{X}$. The reason why linear interpolation works so well for this example is because the function $\sin(x)$ is very well approximated by a linear function for the range of values within each vector.
\begin{figure}
\subfigure{\includegraphics[width=7cm]{sizes.png}}
\subfigure{\includegraphics[width=7cm]{rf_insts}}
%\includegraphics[scale=0.3]{sizes.png}
%\includegraphics[scale=0.3]{rf_insts.png}
\caption{Sizes and theoretical sizes for the training and test sets as a function of the Hole probability (on the left). Number of $\mathcal{RF}$ models used as a function of the missing data (on the right).}
\label{fig:rf_selcs}
\end{figure}
The best of the other methods is the Random Forest Selection method of level $1$ and the Random Forest Selection method with meta model.
In Figure \ref{fig:rf_selcs} different characteristics of the Random Forest Selection level 1 are shown. In particular in the left in-set we shown what is the size of the test set $\mathcal{P}$ and the effective size of the training set. The size of the test set decreases because those tuples with $Y_j=\varnothing$ or with $w_h\left(\mathcal{M}\left(\mathbf{X}_j\right)\right)=p$ cannot be considered. In the case $Y_j=\varnothing$ because there is no value to test against and if $w_h=p$ because there is nothing to predict from. Since the probability for $Y_j$ being $\varnothing$ is $Pr$:
\begin{equation}
|\mathcal{P}| = |\mathcal{P}_0|(1-Pr)
\end{equation}
where $\mathcal{P}_0$ is the size of the test set without any hole, in our case $2500$.
Since each vector in the test set have a different mask vector and each mask vector has a different set of training vectors finding a specific value of the training set size is not straightforward and needs to be computed considering the actual vectors in $\mathcal{D}$ and $\mathcal{P}$ and the missing data on those sets. The effective size has been computing taking the average of the training sizes for each model used. This is compared with the size of the training set erasing all the vectors with any missing component. Statistically the size of the training set is given by the following expression:
\begin{equation}
|\mathcal{D}| = |\mathcal{D}_0|(1-Pr)^p
\end{equation}
where $\mathcal{D}_0$ is the zero hole probability training set size which in our case is $7500$ and as we mentioned above $p=5$.
On the right side of Figure \ref{fig:rf_selcs} the number of different $\mathcal{RF}$ consider for the predictions as a function of the probability of missing data. For $Pr=0$ the number of instances used is $1$ since all the masks are equal for all $\mathbf{X} \in \mathcal{P}$. As $Pr$ starts increasing the number of models used increases to $6$ because by constructions once a hole is produce in the stream of data all masks with $w_h=1$ appears in the corresponding data set. As $Pr$ continues increasing more and more models need to be considered until it reaches the maximum number of masks vectors for $p=5$ this corresponds to $k=31$.
\begin{table}[]
\centering
\begin{tabular}{|c|c|c|}
\hline
\textbf{Data Set} & \textbf{Size} & \textbf{# Features} \\
\hline
\hline
$sin\left(x\right)$ & 10000 & 6 \\
\hline
Wine Quality & 1600 & 12 \\
\hline
Real State Validation & 412 & 8 \\
\hline
Airfoil Self-Noise & 1500 & 6 \\
\hline
Interstate Traffic Flow & 44451 & 8 \\
\hline
\end{tabular}
\caption{Caption}
\label{tab:my_label}
\end{table}
We have applied different
The market historical data set of real estate valuation are collected from Sindian Dist., New Taipei City, Taiwan.
The NASA data set comprises different size NACA 0012 airfoils at various wind tunnel speeds and angles of attack. The span of the airfoil and the observer position were the same in all of the experiments.
These data are the results of a chemical analysis of wines grown in the same region in Italy but derived from three different cultivars. The analysis determined the quantities of 13 constituents found in each of the three types of wines
\begin{figure}
\includegraphics[width=16cm]{images/sin4panel.png}
\caption{Prediction of $\sin\left(x\right)$.}
\label{fig:realState4pane}
\end{figure}
\begin{figure}
\includegraphics[width=16cm]{images/wine4pane.png}
\caption{Wine Quality Data Set.}
\label{fig:wine4pane}
\end{figure}
\begin{figure}
\includegraphics[width=16cm]{images/real_state4pane.png}
\caption{Real State Valuation data Set \cite{UCI-repositorio} prediction results using different methods.}
\label{fig:realState4pane}
\end{figure}
\begin{figure}
\includegraphics[width=16cm]{images/airfoil4pane.png}
\caption{Airfoil Self-Noise Data Set \cite{UCI-repositorio} prediction results using different methods.}
\label{fig:airfoil4pane}
\end{figure}
\begin{figure}
\includegraphics[width=16cm]{images/int_state_traffic4pane.png}
\caption{Prediction of Traffic Flow on interstate.}
\label{fig:int_state_traffic4pane}
\end{figure}
\section{Conclusions}
The Random Forest Selection mechanism introduced in this paper has been proven to be of general use for regression, i.e. prediction of a variable. The
computation expense is more costly than common random forest models since this is based on building multiple models, as many as the mask vector allowed.
\bibliography{bibliography}
\bibliographystyle{splncs03}
\end{document}
%% BibTeX bibliography style `splncs03'
%%
%% BibTeX bibliography style for use with numbered references in
%% Springer Verlag's "Lecture Notes in Computer Science" series.
%% (See Springer's documentation for llncs.cls for
%% more details of the suggested reference format.) Note that this
%% file will not work for author-year style citations.
%%
%% Use \documentclass{llncs} and \bibliographystyle{splncs03}, and cite
%% a reference with (e.g.) \cite{smith77} to get a "[1]" in the text.
%%
%% This file comes to you courtesy of Maurizio "Titto" Patrignani of
%% Dipartimento di Informatica e Automazione Universita' Roma Tre
%%
%% ================================================================================================
%% This was file `titto-lncs-02.bst' produced on Wed Apr 1, 2009
%% Edited by hand by titto based on `titto-lncs-01.bst' (see below)
%%
%% CHANGES (with respect to titto-lncs-01.bst):
%% - Removed the call to \urlprefix (thus no "URL" string is added to the output)
%% ================================================================================================
%% This was file `titto-lncs-01.bst' produced on Fri Aug 22, 2008
%% Edited by hand by titto based on `titto.bst' (see below)
%%
%% CHANGES (with respect to titto.bst):
%% - Removed the "capitalize" command for editors string "(eds.)" and "(ed.)"
%% - Introduced the functions titto.bbl.pages and titto.bbl.page for journal pages (without "pp.")
%% - Added a new.sentence command to separate with a dot booktitle and series in the inproceedings
%% - Commented all new.block commands before urls and notes (to separate them with a comma)
%% - Introduced the functions titto.bbl.volume for handling journal volumes (without "vol." label)
%% - Used for editors the same name conventions used for authors (see function format.in.ed.booktitle)
%% - Removed a \newblock to avoid long spaces between title and "In: ..."
%% - Added function titto.space.prefix to add a space instead of "~" after the (removed) "vol." label
%% ================================================================================================
%% This was file `titto.bst',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% merlin.mbs (with options: `vonx,nm-rvvc,yr-par,jttl-rm,volp-com,jwdpg,jwdvol,numser,ser-vol,jnm-x,btit-rm,bt-rm,edparxc,bkedcap,au-col,in-col,fin-bare,pp,ed,abr,mth-bare,xedn,jabr,and-com,and-com-ed,xand,url,url-blk,em-x,nfss,')
%% ----------------------------------------
%% *** Tentative .bst file for Springer LNCS ***
%%
%% Copyright 1994-2007 Patrick W Daly
% ===============================================================
% IMPORTANT NOTICE:
% This bibliographic style (bst) file has been generated from one or
% more master bibliographic style (mbs) files, listed above.
%
% This generated file can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or any later version.
% ===============================================================
% Name and version information of the main mbs file:
% \ProvidesFile{merlin.mbs}[2007/04/24 4.20 (PWD, AO, DPC)]
% For use with BibTeX version 0.99a or later
%-------------------------------------------------------------------
% This bibliography style file is intended for texts in ENGLISH
% This is a numerical citation style, and as such is standard LaTeX.
% It requires no extra package to interface to the main text.
% The form of the \bibitem entries is
% \bibitem{key}...
% Usage of \cite is as follows:
% \cite{key} ==>> [#]
% \cite[chap. 2]{key} ==>> [#, chap. 2]
% where # is a number determined by the ordering in the reference list.
% The order in the reference list is alphabetical by authors.
%---------------------------------------------------------------------
ENTRY
{ address
author
booktitle
chapter
edition
editor
eid
howpublished
institution
journal
key
month
note
number
organization
pages
publisher
school
series
title
type
url
volume
year
}
{}
{ label }
INTEGERS { output.state before.all mid.sentence after.sentence after.block }
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'mid.sentence :=
#2 'after.sentence :=
#3 'after.block :=
}
STRINGS { s t}
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state after.block =
{ add.period$ write$
% newline$
% "\newblock " write$ % removed for titto-lncs-01
" " write$ % to avoid long spaces between title and "In: ..."
}
{ output.state before.all =
'write$
{ add.period$ " " * write$ }
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
FUNCTION {output}
{ duplicate$ empty$
'pop$
'output.nonnull
if$
}
FUNCTION {output.check}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
FUNCTION {fin.entry}
{ duplicate$ empty$
'pop$
'write$
if$
newline$
}
FUNCTION {new.block}
{ output.state before.all =
'skip$
{ after.block 'output.state := }
if$
}
FUNCTION {new.sentence}
{ output.state after.block =
'skip$
{ output.state before.all =
'skip$
{ after.sentence 'output.state := }
if$
}
if$
}
FUNCTION {add.blank}
{ " " * before.all 'output.state :=
}
FUNCTION {add.colon}
{ duplicate$ empty$
'skip$
{ ":" * add.blank }
if$
}
FUNCTION {date.block}
{
new.block
}
FUNCTION {not}
{ { #0 }
{ #1 }
if$
}
FUNCTION {and}
{ 'skip$
{ pop$ #0 }
if$
}
FUNCTION {or}
{ { pop$ #1 }
'skip$
if$
}
STRINGS {z}
FUNCTION {remove.dots}
{ 'z :=
""
{ z empty$ not }
{ z #1 #1 substring$
z #2 global.max$ substring$ 'z :=
duplicate$ "." = 'pop$
{ * }
if$
}
while$
}
FUNCTION {new.block.checka}
{ empty$
'skip$
'new.block
if$
}
FUNCTION {new.block.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.block
if$
}
FUNCTION {new.sentence.checka}
{ empty$
'skip$
'new.sentence
if$
}
FUNCTION {new.sentence.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.sentence
if$
}
FUNCTION {field.or.null}
{ duplicate$ empty$
{ pop$ "" }
'skip$
if$
}
FUNCTION {emphasize}
{ skip$ }
FUNCTION {tie.or.space.prefix}
{ duplicate$ text.length$ #3 <
{ "~" }
{ " " }
if$
swap$
}
FUNCTION {titto.space.prefix} % always introduce a space
{ duplicate$ text.length$ #3 <
{ " " }
{ " " }
if$
swap$
}
FUNCTION {capitalize}
{ "u" change.case$ "t" change.case$ }
FUNCTION {space.word}
{ " " swap$ * " " * }
% Here are the language-specific definitions for explicit words.
% Each function has a name bbl.xxx where xxx is the English word.
% The language selected here is ENGLISH
FUNCTION {bbl.and}
{ "and"}
FUNCTION {bbl.etal}
{ "et~al." }
FUNCTION {bbl.editors}
{ "eds." }
FUNCTION {bbl.editor}
{ "ed." }
FUNCTION {bbl.edby}
{ "edited by" }
FUNCTION {bbl.edition}
{ "edn." }
FUNCTION {bbl.volume}
{ "vol." }
FUNCTION {titto.bbl.volume} % for handling journals
{ "" }
FUNCTION {bbl.of}
{ "of" }
FUNCTION {bbl.number}
{ "no." }
FUNCTION {bbl.nr}
{ "no." }
FUNCTION {bbl.in}
{ "in" }
FUNCTION {bbl.pages}
{ "pp." }
FUNCTION {bbl.page}
{ "p." }
FUNCTION {titto.bbl.pages} % for journals
{ "" }
FUNCTION {titto.bbl.page} % for journals
{ "" }
FUNCTION {bbl.chapter}
{ "chap." }
FUNCTION {bbl.techrep}
{ "Tech. Rep." }
FUNCTION {bbl.mthesis}
{ "Master's thesis" }
FUNCTION {bbl.phdthesis}
{ "Ph.D. thesis" }
MACRO {jan} {"Jan."}
MACRO {feb} {"Feb."}
MACRO {mar} {"Mar."}
MACRO {apr} {"Apr."}
MACRO {may} {"May"}
MACRO {jun} {"Jun."}
MACRO {jul} {"Jul."}
MACRO {aug} {"Aug."}
MACRO {sep} {"Sep."}
MACRO {oct} {"Oct."}
MACRO {nov} {"Nov."}
MACRO {dec} {"Dec."}
MACRO {acmcs} {"ACM Comput. Surv."}
MACRO {acta} {"Acta Inf."}
MACRO {cacm} {"Commun. ACM"}
MACRO {ibmjrd} {"IBM J. Res. Dev."}
MACRO {ibmsj} {"IBM Syst.~J."}
MACRO {ieeese} {"IEEE Trans. Software Eng."}
MACRO {ieeetc} {"IEEE Trans. Comput."}
MACRO {ieeetcad}
{"IEEE Trans. Comput. Aid. Des."}
MACRO {ipl} {"Inf. Process. Lett."}
MACRO {jacm} {"J.~ACM"}
MACRO {jcss} {"J.~Comput. Syst. Sci."}
MACRO {scp} {"Sci. Comput. Program."}
MACRO {sicomp} {"SIAM J. Comput."}
MACRO {tocs} {"ACM Trans. Comput. Syst."}
MACRO {tods} {"ACM Trans. Database Syst."}
MACRO {tog} {"ACM Trans. Graphic."}
MACRO {toms} {"ACM Trans. Math. Software"}
MACRO {toois} {"ACM Trans. Office Inf. Syst."}
MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."}
MACRO {tcs} {"Theor. Comput. Sci."}
FUNCTION {bibinfo.check}
{ swap$
duplicate$ missing$
{
pop$ pop$
""
}
{ duplicate$ empty$
{
swap$ pop$
}
{ swap$
pop$
}
if$
}
if$
}
FUNCTION {bibinfo.warn}
{ swap$
duplicate$ missing$
{
swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
""
}
{ duplicate$ empty$
{
swap$ "empty " swap$ * " in " * cite$ * warning$
}
{ swap$
pop$
}
if$
}
if$
}
FUNCTION {format.url}
{ url empty$
{ "" }
% { "\urlprefix\url{" url * "}" * }
{ "\url{" url * "}" * } % changed in titto-lncs-02.bst
if$
}
INTEGERS { nameptr namesleft numnames }
STRINGS { bibinfo}
FUNCTION {format.names}
{ 'bibinfo :=
duplicate$ empty$ 'skip$ {
's :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}{, jj}{, f{.}.}"
format.name$
bibinfo bibinfo.check
't :=
nameptr #1 >
{
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
"," *
t "others" =
{
" " * bbl.etal *
}
{ " " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
} if$
}
FUNCTION {format.names.ed}
{
'bibinfo :=
duplicate$ empty$ 'skip$ {
's :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{f{.}.~}{vv~}{ll}{ jj}"
format.name$
bibinfo bibinfo.check
't :=
nameptr #1 >
{
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
"," *
t "others" =
{
" " * bbl.etal *
}
{ " " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
} if$
}
FUNCTION {format.authors}
{ author "author" format.names
}
FUNCTION {get.bbl.editor}
{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }
FUNCTION {format.editors}
{ editor "editor" format.names duplicate$ empty$ 'skip$
{
" " *
get.bbl.editor
% capitalize
"(" swap$ * ")" *
*
}
if$
}
FUNCTION {format.note}
{
note empty$
{ "" }
{ note #1 #1 substring$
duplicate$ "{" =
'skip$
{ output.state mid.sentence =
{ "l" }
{ "u" }
if$
change.case$
}
if$
note #2 global.max$ substring$ * "note" bibinfo.check
}
if$
}
FUNCTION {format.title}
{ title
duplicate$ empty$ 'skip$
{ "t" change.case$ }
if$
"title" bibinfo.check
}
FUNCTION {output.bibitem}
{ newline$
"\bibitem{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
FUNCTION {n.dashify}
{
't :=
""
{ t empty$ not }
{ t #1 #1 substring$ "-" =
{ t #1 #2 substring$ "--" = not
{ "--" *
t #2 global.max$ substring$ 't :=
}
{ { t #1 #1 substring$ "-" = }
{ "-" *
t #2 global.max$ substring$ 't :=
}
while$
}
if$
}
{ t #1 #1 substring$ *
t #2 global.max$ substring$ 't :=
}
if$
}
while$
}
FUNCTION {word.in}
{ bbl.in capitalize
":" *
" " * }
FUNCTION {format.date}
{
month "month" bibinfo.check
duplicate$ empty$
year "year" bibinfo.check duplicate$ empty$
{ swap$ 'skip$
{ "there's a month but no year in " cite$ * warning$ }
if$
*
}
{ swap$ 'skip$
{
swap$
" " * swap$
}
if$
*
remove.dots
}
if$
duplicate$ empty$
'skip$
{
before.all 'output.state :=
" (" swap$ * ")" *
}
if$
}
FUNCTION {format.btitle}
{ title "title" bibinfo.check
duplicate$ empty$ 'skip$
{
}
if$
}
FUNCTION {either.or.check}
{ empty$
'pop$
{ "can't use both " swap$ * " fields in " * cite$ * warning$ }
if$
}
FUNCTION {format.bvolume}
{ volume empty$
{ "" }
{ bbl.volume volume tie.or.space.prefix
"volume" bibinfo.check * *
series "series" bibinfo.check
duplicate$ empty$ 'pop$
{ emphasize ", " * swap$ * }
if$
"volume and number" number either.or.check
}
if$
}
FUNCTION {format.number.series}
{ volume empty$
{ number empty$
{ series field.or.null }
{ output.state mid.sentence =
{ bbl.number }
{ bbl.number capitalize }
if$
number tie.or.space.prefix "number" bibinfo.check * *
series empty$
{ "there's a number but no series in " cite$ * warning$ }
{ bbl.in space.word *
series "series" bibinfo.check *
}
if$
}
if$
}
{ "" }
if$
}
FUNCTION {format.edition}
{ edition duplicate$ empty$ 'skip$
{
output.state mid.sentence =
{ "l" }
{ "t" }
if$ change.case$
"edition" bibinfo.check
" " * bbl.edition *
}
if$
}
INTEGERS { multiresult }
FUNCTION {multi.page.check}
{ 't :=
#0 'multiresult :=
{ multiresult not
t empty$ not
and
}
{ t #1 #1 substring$
duplicate$ "-" =
swap$ duplicate$ "," =
swap$ "+" =
or or
{ #1 'multiresult := }
{ t #2 global.max$ substring$ 't := }
if$
}
while$
multiresult
}
FUNCTION {format.pages}
{ pages duplicate$ empty$ 'skip$
{ duplicate$ multi.page.check
{
bbl.pages swap$
n.dashify
}
{
bbl.page swap$
}
if$
tie.or.space.prefix
"pages" bibinfo.check
* *
}
if$
}
FUNCTION {format.journal.pages}
{ pages duplicate$ empty$ 'pop$
{ swap$ duplicate$ empty$
{ pop$ pop$ format.pages }
{
", " *
swap$
n.dashify
pages multi.page.check
'titto.bbl.pages
'titto.bbl.page
if$
swap$ tie.or.space.prefix
"pages" bibinfo.check
* *
*
}
if$
}
if$
}
FUNCTION {format.journal.eid}
{ eid "eid" bibinfo.check
duplicate$ empty$ 'pop$
{ swap$ duplicate$ empty$ 'skip$
{
", " *
}
if$
swap$ *
}
if$
}
FUNCTION {format.vol.num.pages} % this function is used only for journal entries
{ volume field.or.null
duplicate$ empty$ 'skip$
{
% bbl.volume swap$ tie.or.space.prefix
titto.bbl.volume swap$ titto.space.prefix
% rationale for the change above: for journals you don't want "vol." label
% hence it does not make sense to attach the journal number to the label when
% it is short
"volume" bibinfo.check
* *
}
if$
number "number" bibinfo.check duplicate$ empty$ 'skip$
{
swap$ duplicate$ empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
swap$
"(" swap$ * ")" *
}
if$ *
eid empty$
{ format.journal.pages }
{ format.journal.eid }
if$
}
FUNCTION {format.chapter.pages}
{ chapter empty$
'format.pages
{ type empty$
{ bbl.chapter }
{ type "l" change.case$
"type" bibinfo.check
}
if$
chapter tie.or.space.prefix
"chapter" bibinfo.check
* *
pages empty$
'skip$
{ ", " * format.pages * }
if$
}
if$
}
FUNCTION {format.booktitle}
{
booktitle "booktitle" bibinfo.check
}
FUNCTION {format.in.ed.booktitle}
{ format.booktitle duplicate$ empty$ 'skip$
{
% editor "editor" format.names.ed duplicate$ empty$ 'pop$ % changed by titto
editor "editor" format.names duplicate$ empty$ 'pop$
{
" " *
get.bbl.editor
% capitalize
"(" swap$ * ") " *
* swap$
* }
if$
word.in swap$ *
}
if$
}
FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
month empty$ year empty$ note empty$
and and and and and
key empty$ not and
{ "all relevant fields are empty in " cite$ * warning$ }
'skip$
if$
}
FUNCTION {format.thesis.type}
{ type duplicate$ empty$
'pop$
{ swap$ pop$
"t" change.case$ "type" bibinfo.check
}
if$
}
FUNCTION {format.tr.number}
{ number "number" bibinfo.check
type duplicate$ empty$
{ pop$ bbl.techrep }
'skip$
if$
"type" bibinfo.check
swap$ duplicate$ empty$
{ pop$ "t" change.case$ }
{ tie.or.space.prefix * * }
if$
}
FUNCTION {format.article.crossref}
{
key duplicate$ empty$
{ pop$
journal duplicate$ empty$
{ "need key or journal for " cite$ * " to crossref " * crossref * warning$ }
{ "journal" bibinfo.check emphasize word.in swap$ * }
if$
}
{ word.in swap$ * " " *}
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.crossref.editor}
{ editor #1 "{vv~}{ll}" format.name$
"editor" bibinfo.check
editor num.names$ duplicate$
#2 >
{ pop$
"editor" bibinfo.check
" " * bbl.etal
*
}
{ #2 <
'skip$
{ editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
{
"editor" bibinfo.check
" " * bbl.etal
*
}
{
bbl.and space.word
* editor #2 "{vv~}{ll}" format.name$
"editor" bibinfo.check
*
}
if$
}
if$
}
if$
}
FUNCTION {format.book.crossref}
{ volume duplicate$ empty$
{ "empty volume in " cite$ * "'s crossref of " * crossref * warning$
pop$ word.in
}
{ bbl.volume
capitalize
swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word *
}
if$
editor empty$
editor field.or.null author field.or.null =
or
{ key empty$
{ series empty$
{ "need editor, key, or series for " cite$ * " to crossref " *
crossref * warning$
"" *
}
{ series emphasize * }
if$
}
{ key * }
if$
}
{ format.crossref.editor * }
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.incoll.inproc.crossref}
{
editor empty$
editor field.or.null author field.or.null =
or
{ key empty$
{ format.booktitle duplicate$ empty$
{ "need editor, key, or booktitle for " cite$ * " to crossref " *
crossref * warning$
}
{ word.in swap$ * }
if$
}
{ word.in key * " " *}
if$
}
{ word.in format.crossref.editor * " " *}
if$
" \cite{" * crossref * "}" *
}
FUNCTION {format.org.or.pub}
{ 't :=
""
address empty$ t empty$ and
'skip$
{
t empty$
{ address "address" bibinfo.check *
}
{ t *
address empty$
'skip$
{ ", " * address "address" bibinfo.check * }
if$
}
if$
}
if$
}
FUNCTION {format.publisher.address}
{ publisher "publisher" bibinfo.warn format.org.or.pub
}
FUNCTION {format.organization.address}
{ organization "organization" bibinfo.check format.org.or.pub
}
FUNCTION {article}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
new.block
crossref missing$
{
journal
"journal" bibinfo.check
"journal" output.check
add.blank
format.vol.num.pages output
format.date "year" output.check
}
{ format.article.crossref output.nonnull
format.pages output
}
if$
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {book}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
add.colon
}
{ format.authors output.nonnull
add.colon
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
new.block
format.btitle "title" output.check
crossref missing$
{ format.bvolume output
new.block
new.sentence
format.number.series output
format.publisher.address output
}
{
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
format.date "year" output.check
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {booklet}
{ output.bibitem
format.authors output
add.colon
new.block
format.title "title" output.check
new.block
howpublished "howpublished" bibinfo.check output
address "address" bibinfo.check output
format.date output
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {inbook}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
add.colon
}
{ format.authors output.nonnull
add.colon
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
new.block
format.btitle "title" output.check
crossref missing$
{
format.bvolume output
format.chapter.pages "chapter and pages" output.check
new.block
new.sentence
format.number.series output
format.publisher.address output
}
{
format.chapter.pages "chapter and pages" output.check
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
format.date "year" output.check
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {incollection}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
format.bvolume output
format.chapter.pages output
new.sentence
format.number.series output
format.publisher.address output
format.edition output
format.date "year" output.check
}
{ format.incoll.inproc.crossref output.nonnull
format.chapter.pages output
}
if$
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {inproceedings}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
new.sentence % added by titto
format.bvolume output
format.pages output
new.sentence
format.number.series output
publisher empty$
{ format.organization.address output }
{ organization "organization" bibinfo.check output
format.publisher.address output
}
if$
format.date "year" output.check
}
{ format.incoll.inproc.crossref output.nonnull
format.pages output
}
if$
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {conference} { inproceedings }
FUNCTION {manual}
{ output.bibitem
author empty$
{ organization "organization" bibinfo.check
duplicate$ empty$ 'pop$
{ output
address "address" bibinfo.check output
}
if$
}
{ format.authors output.nonnull }
if$
add.colon
new.block
format.btitle "title" output.check
author empty$
{ organization empty$
{
address new.block.checka
address "address" bibinfo.check output
}
'skip$
if$
}
{
organization address new.block.checkb
organization "organization" bibinfo.check output
address "address" bibinfo.check output
}
if$
format.edition output
format.date output
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {mastersthesis}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.btitle
"title" output.check
new.block
bbl.mthesis format.thesis.type output.nonnull
school "school" bibinfo.warn output
address "address" bibinfo.check output
format.date "year" output.check
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {misc}
{ output.bibitem
format.authors output
add.colon
title howpublished new.block.checkb
format.title output
howpublished new.block.checka
howpublished "howpublished" bibinfo.check output
format.date output
% new.block
format.url output
% new.block
format.note output
fin.entry
empty.misc.check
}
FUNCTION {phdthesis}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.btitle
"title" output.check
new.block
bbl.phdthesis format.thesis.type output.nonnull
school "school" bibinfo.warn output
address "address" bibinfo.check output
format.date "year" output.check
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {proceedings}
{ output.bibitem
editor empty$
{ organization "organization" bibinfo.check output
}
{ format.editors output.nonnull }
if$
add.colon
new.block
format.btitle "title" output.check
format.bvolume output
editor empty$
{ publisher empty$
{ format.number.series output }
{
new.sentence
format.number.series output
format.publisher.address output
}
if$
}
{ publisher empty$
{
new.sentence
format.number.series output
format.organization.address output }
{
new.sentence
format.number.series output
organization "organization" bibinfo.check output
format.publisher.address output
}
if$
}
if$
format.date "year" output.check
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {techreport}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title
"title" output.check
new.block
format.tr.number output.nonnull
institution "institution" bibinfo.warn output
address "address" bibinfo.check output
format.date "year" output.check
% new.block
format.url output
% new.block
format.note output
fin.entry
}
FUNCTION {unpublished}
{ output.bibitem
format.authors "author" output.check
add.colon
new.block
format.title "title" output.check
format.date output
% new.block
format.url output
% new.block
format.note "note" output.check
fin.entry
}
FUNCTION {default.type} { misc }
READ
FUNCTION {sortify}
{ purify$
"l" change.case$
}
INTEGERS { len }
FUNCTION {chop.word}
{ 's :=
'len :=
s #1 len substring$ =
{ s len #1 + global.max$ substring$ }
's
if$
}
FUNCTION {sort.format.names}
{ 's :=
#1 'nameptr :=
""
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{ll{ }}{ ff{ }}{ jj{ }}"
format.name$ 't :=
nameptr #1 >
{
" " *
namesleft #1 = t "others" = and
{ "zzzzz" * }
{ t sortify * }
if$
}
{ t sortify * }
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {sort.format.title}
{ 't :=
"A " #2
"An " #3
"The " #4 t chop.word
chop.word
chop.word
sortify
#1 global.max$ substring$
}
FUNCTION {author.sort}
{ author empty$
{ key empty$
{ "to sort, need author or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.editor.sort}
{ author empty$
{ editor empty$
{ key empty$
{ "to sort, need author, editor, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ editor sort.format.names }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.organization.sort}
{ author empty$
{ organization empty$
{ key empty$
{ "to sort, need author, organization, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ "The " #4 organization chop.word sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {editor.organization.sort}
{ editor empty$
{ organization empty$
{ key empty$
{ "to sort, need editor, organization, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ "The " #4 organization chop.word sortify }
if$
}
{ editor sort.format.names }
if$
}
FUNCTION {presort}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.sort
{ type$ "proceedings" =
'editor.organization.sort
{ type$ "manual" =
'author.organization.sort
'author.sort
if$
}
if$
}
if$
" "
*
year field.or.null sortify
*
" "
*
title field.or.null
sort.format.title
*
#1 entry.max$ substring$
'sort.key$ :=
}
ITERATE {presort}
SORT
STRINGS { longest.label }
INTEGERS { number.label longest.label.width }
FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
#1 'number.label :=
#0 'longest.label.width :=
}
FUNCTION {longest.label.pass}
{ number.label int.to.str$ 'label :=
number.label #1 + 'number.label :=
label width$ longest.label.width >
{ label 'longest.label :=
label width$ 'longest.label.width :=
}
'skip$
if$
}
EXECUTE {initialize.longest.label}
ITERATE {longest.label.pass}
FUNCTION {begin.bib}
{ preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{" longest.label * "}" *
write$ newline$
"\providecommand{\url}[1]{\texttt{#1}}"
write$ newline$
"\providecommand{\urlprefix}{URL }"
write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
ITERATE {call.type$}
FUNCTION {end.bib}
{ newline$
"\end{thebibliography}" write$ newline$
}
EXECUTE {end.bib}
%% End of customized bst file
%%
%% End of file `titto.bst'.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment