diff --git a/markdown2svg.cabal b/markdown2svg.cabal
--- a/markdown2svg.cabal
+++ b/markdown2svg.cabal
@@ -2,7 +2,7 @@
 cabal-version:	>=1.8
 
 name:		markdown2svg
-version:	0.0.1.19
+version:	0.0.1.20
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -31,7 +31,7 @@
 source-repository	this
   type:		git
   location:	git://github.com/YoshikuniJujo/markdown2svg.git
-  tag:		0.0.1.19
+  tag:		0.0.1.20
 
 executable markdown2svg
   hs-source-dirs:	src
diff --git a/src/SVG.hs b/src/SVG.hs
--- a/src/SVG.hs
+++ b/src/SVG.hs
@@ -13,17 +13,22 @@
 import SepWords
 import Image
 
-headerFont, normalFont, codeFont :: Font
+type FontsS = (String, String, String)
+type Fonts = (Font, Font, Font)
+
+-- headerFont, normalFont, codeFont :: Font
 -- headerFont = Font "Kochi Gothic" Normal
 -- normalFont = Font "Kochi Mincho" Normal
-headerFont = Font "Sans" Normal
-normalFont = Font "Serif" Normal
+-- headerFont = Font "Sans" Normal
+-- normalFont = Font "Serif" Normal
 -- normalFont = "Kochi Gothic"
 -- codeFont = "Kochi Gothic"
 codeFont = Font "Monospace" Normal
 
-textToSVG :: [(FilePath, String)] -> Bool -> Double -> [Text] -> [String]
-textToSVG fp n r = map (showSVG (width r) (height r)) . textToSVGData fp r (topMargin r) .
+textToSVG :: FontsS -> [(FilePath, String)] -> Bool -> Double -> [Text] -> [String]
+textToSVG (hf, nf, cf) fp n r =
+	map (showSVG (width r) (height r)) .
+	textToSVGData (Font hf Normal, Font nf Normal, Font cf Normal) fp r (topMargin r) .
 	preprocess .
 	if n then addChapters [Nothing, Just 0, Just 0, Just 0, Nothing, Nothing] else id
 
@@ -60,47 +65,47 @@
 lineChars :: Int
 lineChars = 60
 
-textToSVGData :: [(FilePath, String)] -> Double -> Double -> [Text] -> [[SVG]]
-textToSVGData fp r h [] = [[]]
-textToSVGData fp r h (Header n s : ts)
+textToSVGData :: Fonts -> [(FilePath, String)] -> Double -> Double -> [Text] -> [[SVG]]
+textToSVGData fs@(hf, nf, cf) fp r h [] = [[]]
+textToSVGData fs@(hf, nf, cf) fp r h (Header n s : ts)
 	| h > bottomBorder r - headerSep n r = [l] : all
 	| otherwise = (l : one) : rest
 	where
-	l = Text (TopLeft (leftMargin r) (h + headerSep n r)) (header n r) (ColorName "black") headerFont s
-	one : rest = textToSVGData fp r (h + headerSep n r * 5 / 4) ts
-	all = textToSVGData fp r (topMargin r) ts
-textToSVGData fp r h (Paras [] : ts) = textToSVGData fp r h ts
-textToSVGData fp r h (Paras (p : ps) : ts)
+	l = Text (TopLeft (leftMargin r) (h + headerSep n r)) (header n r) (ColorName "black") hf s
+	one : rest = textToSVGData fs fp r (h + headerSep n r * 5 / 4) ts
+	all = textToSVGData fs fp r (topMargin r) ts
+textToSVGData fs@(hf, nf, cf) fp r h (Paras [] : ts) = textToSVGData fs fp r h ts
+textToSVGData fs@(hf, nf, cf) fp r h (Paras (p : ps) : ts)
 	| h' > bottomBorder r = [] : (svgs' ++ one') : rest'
 	| otherwise = (svgs ++ one) : rest
 	where
-	(h', svgs) = paraToSVGData r h p
-	(h'', svgs') = paraToSVGData r (topMargin r) p
-	one : rest = textToSVGData fp r h' (Paras ps : ts)
-	one' : rest' = textToSVGData fp r h'' (Paras ps : ts)
-textToSVGData fp r h (List l : ts)
+	(h', svgs) = paraToSVGData nf r h p
+	(h'', svgs') = paraToSVGData nf r (topMargin r) p
+	one : rest = textToSVGData fs fp r h' (Paras ps : ts)
+	one' : rest' = textToSVGData fs fp r h'' (Paras ps : ts)
+textToSVGData fs@(hf, nf, cf) fp r h (List l : ts)
 	| h' > bottomBorder r = [] : (svgs' ++ one') : rest'
 	| otherwise = (svgs ++ one) : rest
 	where
-	(_, h', svgs) = listToSVGData 1 "*+-------" r (h + 100 * r) (listLeftMargin r) l
-	(_, h'', svgs') = listToSVGData 1 "*+-------" r (topMargin r) (listLeftMargin r) l
-	one : rest = textToSVGData fp r (h' + 100 * r) ts
-	one' : rest' = textToSVGData fp r (h'' + 100 * r) ts
-textToSVGData fp r h (Code s : ts)
+	(_, h', svgs) = listToSVGData nf 1 "*+-------" r (h + 100 * r) (listLeftMargin r) l
+	(_, h'', svgs') = listToSVGData nf 1 "*+-------" r (topMargin r) (listLeftMargin r) l
+	one : rest = textToSVGData fs fp r (h' + 100 * r) ts
+	one' : rest' = textToSVGData fs fp r (h'' + 100 * r) ts
+textToSVGData fs@(hf, nf, cf) fp r h (Code s : ts)
 	| h' > bottomBorder r = [] : (svgs' ++ one') : rest'
 	| otherwise = (svgs ++ one) : rest
 	where
-	(h', svgs) = codeToSVGData r (h + codeSep r) (lines s)
-	(h'', svgs') = codeToSVGData r (topMargin r) (lines s)
-	one : rest = textToSVGData fp r (h' + codeSep r) ts
-	one' : rest' = textToSVGData fp r (h'' + codeSep r) ts
-textToSVGData fp r h (Image _ p ttl : ts)
+	(h', svgs) = codeToSVGData cf r (h + codeSep r) (lines s)
+	(h'', svgs') = codeToSVGData cf r (topMargin r) (lines s)
+	one : rest = textToSVGData fs fp r (h' + codeSep r) ts
+	one' : rest' = textToSVGData fs fp r (h'' + codeSep r) ts
+textToSVGData fs@(hf, nf, cf) fp r h (Image _ p ttl : ts)
 	| h + ht > bottomBorder r =
 		[] : (SVG.Image (TopLeft left (topMargin r)) wt ht p : svg') : svgs'
 	| otherwise = (SVG.Image (TopLeft left h) wt ht p : svg) : svgs
 	where
-	svg : svgs = textToSVGData fp r (h + ht + r * 100) ts
-	svg' : svgs' = textToSVGData fp r (topMargin r + ht + r * 100) ts
+	svg : svgs = textToSVGData fs fp r (h + ht + r * 100) ts
+	svg' : svgs' = textToSVGData fs fp r (topMargin r + ht + r * 100) ts
 	size = case ttl of
 		"small" -> Small
 		"large" -> Large
@@ -113,14 +118,14 @@
 		"large" -> leftMargin r
 		"small" -> ratio * 4 / 10
 		_ -> ratio * 1 / 3
-textToSVGData fp r h (Link txt addrs ttl : ts)
+textToSVGData fs@(hf, nf, cf) fp r h (Link txt addrs ttl : ts)
 	| h + normalSep r > bottomBorder r = [] : (l : svg') : svgs'
 	| otherwise = (l : svg) : svgs
 	where
-	svg : svgs = textToSVGData fp r (h + normalSep r) ts
-	svg' : svgs' = textToSVGData fp r (topMargin r) ts
+	svg : svgs = textToSVGData fs fp r (h + normalSep r) ts
+	svg' : svgs' = textToSVGData fs fp r (topMargin r) ts
 	l = Text (TopLeft (paraLeftMargin r) (h + normalSep r)) (normal r) (ColorName "blue")
-			normalFont $ txt ++ "(" ++ addrs ++ ")"
+			nf $ txt ++ "(" ++ addrs ++ ")"
 
 splitAtString :: Int -> String -> (String, String)
 splitAtString len = sepStr 0
@@ -152,45 +157,45 @@
 		| isAscii c = let s : ss = sepStr (n + 1) cs in (c : s) : ss
 		| otherwise = let s : ss = sepStr (n + 2) cs in (c : s) : ss
 
-paraToSVGData :: Double -> Double -> String -> (Double, [SVG])
-paraToSVGData r h str = (h', l : svgs)
+paraToSVGData :: Font -> Double -> Double -> String -> (Double, [SVG])
+paraToSVGData nf r h str = (h', l : svgs)
 	where
 	(s, t) = splitWords (lineChars - 3) str
-	l = Text (TopLeft (paraLeftMargin r + normal r) (h + normal r)) (normal r) (ColorName "black") normalFont s
+	l = Text (TopLeft (paraLeftMargin r + normal r) (h + normal r)) (normal r) (ColorName "black") nf s
 	ls = sepWords lineChars t
-	(h', svgs) = strsToSVGData r (h + normalSep r) ls
+	(h', svgs) = strsToSVGData nf r (h + normalSep r) ls
 
-strsToSVGData :: Double -> Double -> [String] -> (Double, [SVG])
-strsToSVGData r h [] = (h, [])
-strsToSVGData r h ([] : ss) = strsToSVGData r h ss
-strsToSVGData r h (s : ss) = (h', l : svgs)
+strsToSVGData :: Font -> Double -> Double -> [String] -> (Double, [SVG])
+strsToSVGData _ r h [] = (h, [])
+strsToSVGData nf r h ([] : ss) = strsToSVGData nf r h ss
+strsToSVGData nf r h (s : ss) = (h', l : svgs)
 	where
-	l = Text (TopLeft (paraLeftMargin r) (h + normal r)) (normal r) (ColorName "black") normalFont s
-	(h', svgs) = strsToSVGData r (h + normalSep r) ss
+	l = Text (TopLeft (paraLeftMargin r) (h + normal r)) (normal r) (ColorName "black") nf s
+	(h', svgs) = strsToSVGData nf r (h + normalSep r) ss
 
-listToSVGData :: Int -> String -> Double -> Double -> Double -> List -> (Int, Double, [SVG])
-listToSVGData n sym r y x [] = (n, y, [])
-listToSVGData n sym r y x (lst : lsts) = (n'', y'', svgs ++ svgs')
+listToSVGData :: Font -> Int -> String -> Double -> Double -> Double -> List -> (Int, Double, [SVG])
+listToSVGData _ n sym r y x [] = (n, y, [])
+listToSVGData nf n sym r y x (lst : lsts) = (n'', y'', svgs ++ svgs')
 	where
-	(n', y', svgs) = list1ToSVGData n sym r y x lst
-	(n'', y'', svgs') = listToSVGData n' sym r y' x lsts
+	(n', y', svgs) = list1ToSVGData nf n sym r y x lst
+	(n'', y'', svgs') = listToSVGData nf n' sym r y' x lsts
 
-list1ToSVGData :: Int -> String -> Double -> Double -> Double -> List1 -> (Int, Double, [SVG])
-list1ToSVGData n sym r y x (BulItem s lst) = (n, h', l : svgs)
+list1ToSVGData :: Font -> Int -> String -> Double -> Double -> Double -> List1 -> (Int, Double, [SVG])
+list1ToSVGData nf n sym r y x (BulItem s lst) = (n, h', l : svgs)
 	where
-	l = Text (TopLeft x (y + normal r)) (normal r) (ColorName "black") normalFont $ head sym : ' ' : s
-	(_, h', svgs) = listToSVGData n (tail sym) r (y + normalSep r) (x + normal r * 2) lst
-list1ToSVGData n sym r y x (OrdItem s lst) = (n + 1, h', l : svgs)
+	l = Text (TopLeft x (y + normal r)) (normal r) (ColorName "black") nf $ head sym : ' ' : s
+	(_, h', svgs) = listToSVGData nf n (tail sym) r (y + normalSep r) (x + normal r * 2) lst
+list1ToSVGData nf n sym r y x (OrdItem s lst) = (n + 1, h', l : svgs)
 	where
-	l = Text (TopLeft x (y + normal r)) (normal r) (ColorName "black") normalFont $ show n ++ '.' : ' ' : s
-	(_, h', svgs) = listToSVGData n (tail sym) r (y + normalSep r) (x + normal r * 2) lst
+	l = Text (TopLeft x (y + normal r)) (normal r) (ColorName "black") nf $ show n ++ '.' : ' ' : s
+	(_, h', svgs) = listToSVGData nf n (tail sym) r (y + normalSep r) (x + normal r * 2) lst
 
-codeToSVGData :: Double -> Double -> [String] -> (Double, [SVG])
-codeToSVGData _ h [] = (h, [])
-codeToSVGData r h (s : ss) = (h', l : svgs)
+codeToSVGData :: Font -> Double -> Double -> [String] -> (Double, [SVG])
+codeToSVGData _ _ h [] = (h, [])
+codeToSVGData cf r h (s : ss) = (h', l : svgs)
 	where
-	l = Text (TopLeft (codeLeftMargin r) (h + code r)) (code r) (ColorName "black") codeFont s
-	(h', svgs) = codeToSVGData r (h + codeSep r) ss
+	l = Text (TopLeft (codeLeftMargin r) (h + code r)) (code r) (ColorName "black") cf s
+	(h', svgs) = codeToSVGData cf r (h + codeSep r) ss
 
 addChapters :: [Maybe Int] -> [Text] -> [Text]
 addChapters _ [] = []
diff --git a/src/markdown2svg.hs b/src/markdown2svg.hs
--- a/src/markdown2svg.hs
+++ b/src/markdown2svg.hs
@@ -8,7 +8,7 @@
 import System.Directory
 import File.Binary
 
-import Text.Markdown.Pap
+import Text.Markdown.Pap (parse)
 import SVG
 
 main :: IO ()
@@ -19,11 +19,14 @@
 	let	size = getSizeR opts
 		dir = getDir opts
 		idir = getIDir opts
+		hfont = getFont opts Header
+		nfont = getFont opts Normal
+		cfont = getFont opts Code
 	cnt <- readFile fp
 	is <- mapM pathCont =<< getImageFilePath (fromMaybe "." idir)
 	copy (fromMaybe "." idir) (fromMaybe "." dir) $ map (takeFileName . fst) is
 	case parse cnt of
-		Just t -> forM_ (zip [1 ..] $ textToSVG is True size t) $ \(i, s) ->
+		Just t -> forM_ (zip [1 ..] $ textToSVG (hfont, nfont, cfont) is True size t) $ \(i, s) ->
 			writeFile (mkSVGFileName dir fp i) s
 		_ -> return ()
 
@@ -36,13 +39,23 @@
 	where
 	s = show x
 
-data Option = Dir FilePath | Size Double | ImageDir FilePath deriving Show
+data Option
+	= Dir FilePath
+	| Size Double
+	| ImageDir FilePath
+	| Font FontType String
+	deriving Show
 
+data FontType = Header | Normal | Code deriving (Eq, Show)
+
 options :: [OptDescr Option]
 options = [
 	Option "d" [] (ReqArg Dir "output directory") "set ouput directory",
 	Option "s" [] (ReqArg (Size . read) "size ratio") "set size ratio",
-	Option "i" [] (ReqArg ImageDir "image directory") "set image directory" ]
+	Option "i" [] (ReqArg ImageDir "image directory") "set image directory",
+	Option "" ["header-font"] (ReqArg (Font Header) "header font") "set header font",
+	Option "" ["normal-font"] (ReqArg (Font Normal) "normal font") "set normal font",
+	Option "" ["code-font"] (ReqArg (Font Code) "code font") "set code font" ]
 
 getDir, getIDir :: [Option] -> Maybe FilePath
 getDir [] = Nothing
@@ -57,6 +70,14 @@
 getSizeR [] = 0.15
 getSizeR (Size sr : _) = sr
 getSizeR (_ : ops) = getSizeR ops
+
+getFont :: [Option] -> FontType -> String
+getFont [] Header = "Sans"
+getFont [] Normal = "Serif"
+getFont [] Code = "Monospace"
+getFont (Font ft fn : _) ft0
+	| ft == ft0 = fn
+getFont (_ : ops) ft0 = getFont ops ft0
 
 getImageFilePath :: FilePath -> IO [FilePath]
 getImageFilePath fp = do
