diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -4,6 +4,7 @@
 import System.Directory       (doesDirectoryExist, createDirectory, copyFile, doesFileExist)
 import System.Directory.Tools (doesNotExistOrOldThan)
 import System.Process         (runProcess, waitForProcess)
+import System.FilePath        (takeDirectory, takeFileName)
 import Control.Monad.Tools    (whenM, unlessM, skipRet)
 import Control.Applicative    ((<$>))
 import Text.RegexPR           (gsubRegexPR)
@@ -11,6 +12,7 @@
 import YJTools.Tribial        (ghcMake)
 import Data.Char              (isSpace)
 import Data.Maybe             (maybeToList)
+import Data.Function.Tools    (applyUnless)
 
 ehaskellDir, haskellSffx, ehsHandleStr, putStrStr :: String
 ehaskellDir  = "_ehs/"
@@ -23,25 +25,27 @@
   args <- getArgs
   let [infile] = dropOptionO args
       outfile  = takeOptionO args
-      exeName = gsubRegexPR "\\." "_" infile
-      exeFile = ehaskellDir ++ exeName
-      srcFile = ehaskellDir ++ exeName ++ haskellSffx
+      edir     = let d = takeDirectory infile
+                  in applyUnless (null d) ((d ++ "/") ++) ehaskellDir
+      exeName  = gsubRegexPR "\\." "_" $ takeFileName infile
+      exeFile  = edir ++ exeName
+      srcFile  = edir ++ exeName ++ haskellSffx
   cont       <- readFile infile
-  unlessM (doesDirectoryExist ehaskellDir) $ createDirectory ehaskellDir
-  copyRequiredFile cont
+  unlessM (doesDirectoryExist edir) $ createDirectory edir
+  copyRequiredFile edir cont
   whenM   (doesNotExistOrOldThan srcFile infile)  $
     writeFile srcFile $ fst $ head $ runParse parseAll ("", cont)
   whenM (doesNotExistOrOldThan exeFile srcFile) $
-    ghcMake exeName ehaskellDir >> return ()
+    ghcMake exeName edir >> return ()
   runProcess exeFile (maybeToList outfile) Nothing Nothing Nothing Nothing Nothing
     >>= waitForProcess
   return ()
 
-copyRequiredFile :: String -> IO ()
-copyRequiredFile src = evalParseT copyRequiredFileParse ("",src) >> return ()
+copyRequiredFile :: FilePath -> String -> IO ()
+copyRequiredFile dir src = evalParseT (copyRequiredFileParse dir) ("",src) >> return ()
 
-copyRequiredFileParse :: ParseT Char IO ()
-copyRequiredFileParse = list crfp >> return ()
+copyRequiredFileParse :: FilePath -> ParseT Char IO ()
+copyRequiredFileParse dir = list crfp >> return ()
   where
   crfp = do
     list $ do
@@ -53,7 +57,7 @@
     list $ spot isSpace
     mn <- neList (spot $ not . isSpace) >>= skipRet (still $ spot $ isSpace)
     let sfn = mn ++ ".hs"
-        dfn = ehaskellDir ++ sfn
+        dfn = dir ++ sfn
     lift $ whenM (doesFileExist sfn) $ whenM (doesNotExistOrOldThan dfn sfn) $
       copyFile sfn dfn
     list $ spot isSpace
@@ -193,8 +197,8 @@
     spot (const True)
 
 mkOutputText txt            = "  " ++ putStrStr ++ " $ " ++ show txt ++ ";\n"
-mkOutputHere code           = "  " ++ code ++ ";\n"
-mkOutputCode code           = "  " ++ code ++ " >>= " ++ putStrStr ++ ";\n"
-mkOutputShowCode code       = "  " ++ code ++ " >>= " ++ putStrStr ++ ". show ;\n"
-mkOutputReturnCode code     = "  " ++ putStrStr ++ " $ " ++ code ++ " ;\n"
-mkOutputReturnShowCode code = "  " ++ putStrStr ++ " $ show" ++ code ++ " ;\n"
+mkOutputHere code           = "  (" ++ code ++ ")" ++ ";\n"
+mkOutputCode code           = "  (" ++ code ++ ") >>= " ++ putStrStr ++ ";\n"
+mkOutputShowCode code       = "  (" ++ code ++ ") >>= " ++ putStrStr ++ ". show ;\n"
+mkOutputReturnCode code     = "  " ++ putStrStr ++ " $ (" ++ code ++ ") ;\n"
+mkOutputReturnShowCode code = "  " ++ putStrStr ++ " $ show (" ++ code ++ ") ;\n"
diff --git a/ehaskell.cabal b/ehaskell.cabal
--- a/ehaskell.cabal
+++ b/ehaskell.cabal
@@ -1,5 +1,5 @@
 Name:		ehaskell
-Version:	0.2
+Version:	0.3
 Cabal-Version:	>= 1.2
 Build-Type:	Simple
 License:	GPL
@@ -7,7 +7,7 @@
 Stability:	experimental
 Author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 Maintainer:	PAF01143@nifty.ne.jp
-Category:	Code Generation
+Category:	Text
 Homepage:	http://homepage3.nifty.com/salamander/second/projects/ehaskell/index.xhtml
 Synopsis:	like eruby, ehaskell is embedded haskell.
 Description:	You can embed haskell in Text file.
@@ -44,5 +44,5 @@
 
 Executable ehs
   Main-Is:		Main.hs
-  Build-Depends:	base, mtlparse >= 0.0.1, yjtools >= 0.7, directory, regexpr >= 0.3.3, process
+  Build-Depends:	base, mtlparse >= 0.0.1, yjtools >= 0.8, directory, regexpr >= 0.3.3, process, filepath
   GHC-Options:		-Wall
