## Wednesday, July 29, 2009

### A Font Survey...

I have recently been looking into Opentype fonts that I can use with XeLaTeX and in my thesis.

The first nice option is Minion/Myriad Pro combination (see previous post), but the fonts aren't open... just free for personal use. Another nice option is the Cambria/Cambria Math but there might be licensing issues since they require MS Windows on the Machine.

The free fonts with equivalent metrics to common fonts are another good option. There's a list of other free fonts also. Matching maths used to be a problem with XeLaTeX, though now the mathspec package makes this easy by allowing one to mix and match symbols and fonts together with simple commands (as shown in previous post for MnSymbol).

OpenOffice has some nice fonts install too... FreeSerif and Nimbus. Charis and Gentium are also good but don't have Small caps support. Fontin has won alot of praise but didn't blow me away. Asana Math doesnt have Italics.

I'm not satisfied by the current choices for math symbols either. Latin Modern (XeLaTeX default) math is nice, MnSymbol is ok and Cambria is very nice but not free.... sigh... the search continues.

Cheers
Shakes - L3mming

EDIT: Some more great links to font list.
Great set of GNU fonts is availble at ADF Fonts too. I'm looking forward for the official Science Publication Fonts.

## Tuesday, July 28, 2009

### XeLaTeX Thesis Choices....

I have spent many hours trying to get my thesis looking just right using XeLaTeX. XeLaTeX is basically an extension to LaTeX based on XeTeX which uses unicode fonts. To me this means that I get to use any font thats freely available very easily. (Not sure whether you should convert from Word? See The Beauty of LaTeX article).

Anyhoo... some interesting facts. Most LaTeX packages can be used with XeLaTeX. In fact I converted to it by changing my template to:
%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass[a4paper,11pt,final,openright,twoside]{memoir}
\RequireXeTeX %Force XeTeX check

%XeLaTeX packages
\usepackage{xltxtra}
\usepackage{fontspec} %Font package
\usepackage{xunicode}
\defaultfontfeatures{Scale=MatchLowercase}

%Select fonts
\setmainfont[Mapping=tex-text]{Minion Pro}
\setmonofont{Courier Std}

\date{}

\begin{document}

\maketitle
\chapter{Title}

\section{Section Title}

\subsection{Subsection Title}
\end{document}

You can then replace Minion Pro, Myriad Pro and Courier Std fonts (which come with Acrobat Reader 9) to any font installed on your system. You will need to compile the document using XeLaTeX rather than LaTeX. Simply reconfigure the latex button of your favourite editor. For those interested in getting MnSymbol package (i.e. the Minion Pro Maths package) to work with XeLaTeX, replace the Select Font part with:
\setprimaryfont{Minion Pro}
\setmainfont[Mapping=tex-text]{Minion Pro}
\setmonofont{Courier Std}
\setmathsfont[Set=Greek,Uppercase=Italic,Lowercase=Italic]{Minion Pro}

Also replacing the XeLaTeX packages section to:
\usepackage[MnSymbol]{mathspec}
\usepackage{xltxtra}
%\usepackage{fontspec}
\usepackage{xunicode}
\defaultfontfeatures{Scale=MatchLowercase}

You can control which font goes to which math font (rm, it etc.). See the mathspec package documentation for details. My experience of XeLaTeX has been quite enjoyable so far, hopefully it stays that way.

Some very useful packages that I've found for my thesis so far has been:
1. Memoir package.... a must really.
2. Natbib... another must
3. The rest in code form:
%Call other packages
\usepackage{varioref} %extends \pageref via \vref to automate things like "on the next page"
\usepackage{memhfixc} %Allows Hyperref in Memoir
\usepackage{graphicx}
\usepackage[draft]{pdfpages}
\usepackage{mdwmath} %Math alignment
\usepackage{mdwtab}
\usepackage[printonlyused,withpage]{acronym} %acronyms package

% Notation package
\usepackage[intoc]{nomencl}% Notation equation ref [refeq]
\makenomenclature

%Temporary Packages
\usepackage[draft]{fixme} %Fix me margin notes and list

4. Others include ntheorem and svn-multi (if you intend on using Subversion for versioning)
Some things to consider though.... XeLaTeX is found in MikTeX 2.7 (Windows) and TeXLive 2008 (Windows/Linux). Ubuntu Linux only uses TeXLive 2007 which is too old and so you will need to install the latest version of TeXLive.... (New version will be out soon)... MikTeX 2.7 has just updated memoir so grab it now if you're on Windows.

Anyway, hope that helps anyone thinking of using XeLaTeX.

Cheers
Shakes - L3mming

EDIT: I have corrected the Minion Pro Math code.
EDIT: I have made the source for a basic but full thesis template is available on GitHub. Enjoy!

## Monday, July 27, 2009

### Windows float to integer compiler woes...

Got my Number Theoretic Transforms to run faster than FFTs from FFTW on Linux via GCC. After attempting to run it on Windows x64 to bench similar result, I found it ran extremely slowly. :(

This was very distressing as what I found was that the truncation of floating pointing numbers to integers is rerouted to a compiler specific function called __ftol (thats float to long), which isn't fast enough.

I found some good links explaining this like Intel Notes on Floating Point-to-Integer Latency and Herf's Know your FPU page. These pages sum up the design flaw in the MSVC 2008 x64 compiler, as most work arounds can be done painlessly only on the x86 version of the compiler.

Apparently they've decided that this function is fast enough, and already marked the compiler flag '/QIfist', which stops it from being used in the x86 compiler, for deprecation!
"No compiler option is needed. The compiler has made significant improvements in float to int conversion speed."
Sigh. I guess this is true for regular use, but my work requires tens to hundreds of milliseconds... and __ftol makes a significant difference. Incidentally, the compiler flag '/fp:fast' did help speed up the program but it is still 2-3 times slower than the GCC version.

I also tried the code
int ftol_ambient(double d) { int i; __asm {     fld d     fistp i } return i;}
Turns out the x64 compiler doesn't support inline assembly.... grrr....

Might have to implement the float casting using SSE (SIMD) intrinsics. Looks like I may have to switch compilers to stick or Linux.

Cheers
Shakes - L3mming

EDIT: The x64 compiler doesn't support inline assembly because it has been replaced with intrinsics. The way to achieve truncation is to use the following code:
static inline int round (double const x){    return _mm_cvtsd_si32(_mm_load_sd(&x));}

### A L3mming's blog...

Just thought I'd start a blog for sharing those "wonderful" Ph.D moments. It will mostly feature some developer findings, XeLaTeX experiences and other life moments that might be beneficial to others.

I guess I should introduce myself a tad... I mainly work on Digital Processing in my Ph.D (or Ph.DuD as I like to call it) using C/C++. I enjoy the Number Theory in my work and the challenges in learning new stuff. I work in Windows and Linux, though I prefer Linux when not gaming.

I have written a scientific visualisation tool called DGV of which I just recently released a new version and hope to release my Ph.D code after its submission.

My wife is expecting our first child in about a month and my 3 years limit (out of 3 1/2) for my Ph.D ends around the same time so It should be very interesting lol.

Well I hope to keep blogging regularly, perhaps fortnightly or as things come about.

Cheers
Shakes - A L3mming