Have a look at biber which in the current 1.5 dev version on SourceForge has a new "tool" mode which allows you to use biber's reencoding and source mapping features independently of biblatex. The source mapping features are what you mainly need from your description and this is all documented in the PDF manual. I can provide specific examples if you have specific questions. biber will do everything you mention above apart from the @string expansion which would be possible to add but as you say, it's fairly idiosyncratic.
Of course, you can do this dynamically with biber too - with the changes being applied as the .bib is read but the .bib is not touched. The new tool mode allows you to write the changed .bib to another file without writing a .bbl.
For example, here is how in tool mode to tackle points 2, 3 5 and 6 in your examples. Point 1 is better handled semantically with biblatex and its max/min names options. Create a biber.conf with:
<config>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map>
<map_step map_field_set="issn" map_null="1"/>
</map>
<map>
<per_type>ARTICLE</per_type>
<map_step map_field_set="title" map_null="1"/>
</map>
<map>
<per_type>ARTICLE</per_type>
<map_step map_field_source="pages" map_final="1"/>
<map_step map_field_set="archiveprefix" map_null="1"/>
<map_step map_field_set="eprint" map_null="1"/>
<map_step map_field_set="primaryclss" map_null="1"/>
</map>
</maps>
<map>
<map_step map_field_source="doi" map_match="[\\;]" map_final="1"/>
<map_step map_field_set="doi" map_null="1"/>
</map>
</sourcemap>
</config>
Then run biber with
biber --tool file.bib
Which will look in the default locations for your biber.conf
and will output a file called file_bibertool.bib
.
This is also all possible, as I said, dynamically using the biber.conf as you process the file normally into a .bbl with biber and also the whole mapping functionality is available in biblatex through macros (see \DeclareSourcemap in the biblatex documentation) if you wanted to do this on a per-document basis dynamically.
Here's a biblatex solution. It doesn't need Biber (though of course it will work with it). It's not intended as a polished solution such as one might put together for a full style: it assumes your requirements apply: just books and articles; no bibliography. It allows you to use \cite
and \parencite
.
I wasn't sure how to deal with post notes. In the end I've slotted them into the middle of the citations, before the year.
I wasn't sure how to deal with repeated citations; as it is, I've just left them as is, but not repeated the year -- on the basis that you are trying to save space! It's probably simple enough, though, that you can pretty much understand what it's doing and fiddle with the details yourself.
(Don't treat this as an endorsement of this sort of citation system! But needs must, and it's quite a nice demonstration of the flexibility of Biblatex.)
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ARTICLE{smith,
author = {Smith and others},
journaltitle = {Phys. Rev. Lett.},
volume = {100},
pages = {123--456},
date = {2012},
}
@BOOK{jones,
author = {Jones, Arthur},
title = {Something about physics},
date = {2011},
publisher = {Dont Print Me},
}
\end{filecontents}
\usepackage[style=authoryear, backend=bibtex, citetracker=true]{biblatex}
% For compression, we just give the *first* page of an article
\DeclareFieldFormat{pages}{%
\mkfirstpage*{#1}}
\renewbibmacro{postnote}{%
\ifboolexpr{ test {\iffieldundef{postnote}}
or test {\iftoggle{postnoteprinted}}}
{}
{\setunit{\addcomma\space at\space}%
\ifboolexpr{ test {\iffieldundef{pagination}}
or test {\iffieldequalstr{pagination}{page}}}
{\printfield[default]{postnote}}
{\printfield{postnote}}
\global\toggletrue{postnoteprinted}}}
\newtoggle{postnoteprinted}
\renewbibmacro*{cite}{%
\global\togglefalse{postnoteprinted}%
\iffieldundef{shorthand}
{\ifboolexpr{ test {\ifentrytype{article}}
or test {\ifentrytype{book}} }
{\DeclareFieldAlias{journaltitle}{default}%
\usedriver{}{\thefield{entrytype}:abbrv}}
{{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
{\usebibmacro{cite:label}%
\setunit{\addspace}}
{\printnames{labelname}%
\setunit{\nameyeardelim}}%
\usebibmacro{cite:labelyear+extrayear}}}}
{\usebibmacro{cite:shorthand}}}
\DeclareBibliographyDriver{article:abbrv}{%
\usebibmacro{begentry}%
\printnames{labelname}
\setunit{\addcomma\space}%
\usebibmacro{journal+issuetitle}%
\setunit{\addcomma\space}%
\usebibmacro{note+pages}%
\usebibmacro{postnote}%
\setunit{\addspace}%
\usebibmacro{bracketedyear}%
\usebibmacro{finentry}}
\DeclareBibliographyDriver{book:abbrv}{%
\usebibmacro{begentry}%
\printnames{labelname}%
\setunit{\addcomma\space}%
\usebibmacro{maintitle+title}%
\usebibmacro{postnote}%
\setunit{\addspace}%
\usebibmacro{bracketedyear}%
\usebibmacro{finentry}}
% Always uses parentheses, because that was what the
% example showed. \mkbibparens would be better IMO.
\newbibmacro{bracketedyear}{%
\ifciteseen
{}
{\iffieldundef{year}
{}
{\printtext{(\printfield{year})}}}}
\addbibresource{\jobname.bib}
\begin{document}
Parenthetical citation: \parencite{smith}. Repeated \parencite[125]{smith}
Citation to a book: \cite[456]{jones}.
\end{document}

Best Answer
I assume you mean using a link shortener like bit.ly or tinyurl?
Personally I would caution against using a link shortener in a printed document (or just generally). Your reference then relies on the link shortener staying active. Link shortening services don’t last forever, and if somebody wants to access a reference and the service has closed down, then your link becomes useless to them. (This is called “link rot”.)
I think the best practice is to minimise the number of URL references, and where you use them, get as much information as possible, just as you would for any other reference. Ideally you want enough information that somebody could find the page with a Google search, and not having to type in a URL. That way, somebody can find the page if they don’t want to type in a URL, or if the URL of the page changes (which often happens).
An interesting approach that I once saw to this problem was to use a Python script to embed a QR code with the URL. The reader could scan the QR code to get the full URL, without having to type it in themselves. Probably not appropriate for an academic document, but interesting nonetheless.
The Internet is a source of many wonderful things. Sadly, permanent references, link shortened or not, is not among them.