mirror of
https://github.com/anoma/juvix.git
synced 2024-12-26 17:13:35 +03:00
bad61a797f
This pr adds two new commands related to latex. 1. `juvix dev latex getJuvixSty`. This command prints the contents of the `juvix.sty` latex package to stdout. It has no options and the expected usage is `juvix dev latex getJuvixSty > juvix.sty`. 2. `juvix dev latex export`. Expects a .juvix file as an argument and outputs to stdout the highlighted module in latex format. Optional flags `--from LINE`, `--to LINE` to output only the specified line range. There is a `--mode` flag to choose how you want the output. ``` • standalone: Output a ready to compile LaTeX file • wrap: Wrap the code in a Verbatim environment • raw: Output only the code (default: standalone) ``` 4. As shown in the standalone output, one is allowed to choose the theme when importing the juvix package like this: `\usepackage[theme = latte]{juvix}`. Available themes are `latte`, `frappe`, `macchiato`, `mocha`. Examples: To generate the following output I ran these commands: ``` cd examples/milestones/HelloWorld mkdir latex juvix dev latex getJuvixSty > latex/juvix.sty juvix dev latex export HelloWorld.juvix > latex/main.tex cd latex xelatex main.tex open main.pdf ``` 1. with `\usepackage[theme = latte]{juvix}`: ![image](https://github.com/user-attachments/assets/200c212f-cc18-4dac-95fe-b3828346e7fa) 1. with `\usepackage[theme = frappe]{juvix}`: ![image](https://github.com/user-attachments/assets/a71d07aa-8adc-485c-a41d-3ea62dc2c5a3) 1. with `\usepackage[theme = macchiato]{juvix}`: ![image](https://github.com/user-attachments/assets/e7e878cf-3c2b-4497-a06c-0e8a445b5116) 1. with `\usepackage[theme = mocha]{juvix}`: ![image](https://github.com/user-attachments/assets/79a4c82c-c90e-4844-baf4-f107d8b8ae20)
41 lines
1.4 KiB
Haskell
41 lines
1.4 KiB
Haskell
module Main (main) where
|
|
|
|
import App
|
|
import CommonOptions
|
|
import Data.String.Interpolate (i)
|
|
import GHC.Conc qualified as GHC
|
|
import GlobalOptions
|
|
import Juvix.Compiler.Pipeline.Root
|
|
import TopCommand
|
|
import TopCommand.Options
|
|
|
|
main :: IO ()
|
|
main = do
|
|
let parserPreferences = prefs showHelpOnEmpty
|
|
invokeDir <- getCurrentDir
|
|
(_runAppIOArgsGlobalOptions, cli) <- customExecParser parserPreferences descr
|
|
numThreads (_runAppIOArgsGlobalOptions ^. globalNumThreads) >>= GHC.setNumCapabilities
|
|
mbuildDir <- mapM (prepathToAbsDir invokeDir) (_runAppIOArgsGlobalOptions ^? globalBuildDir . _Just . pathPath)
|
|
mainFile <- topCommandInputPath cli
|
|
let loggerOpts =
|
|
LoggerOptions
|
|
{ _loggerLevel = _runAppIOArgsGlobalOptions ^. globalLogLevel,
|
|
_loggerUseColors = not (_runAppIOArgsGlobalOptions ^. globalNoColors)
|
|
}
|
|
runM
|
|
. runTaggedLockPermissive
|
|
. runLoggerIO loggerOpts
|
|
. runFilesIO
|
|
$ do
|
|
mapM_ checkMainFile mainFile
|
|
_runAppIOArgsRoot <- findRootAndChangeDir (containingDir <$> mainFile) mbuildDir invokeDir
|
|
runAppIO RunAppIOArgs {..} (runTopCommand cli)
|
|
where
|
|
checkMainFile :: forall r b. (Members '[Logger, EmbedIO] r) => SomePath b -> Sem r ()
|
|
checkMainFile p = unlessM (liftIO (doesSomePathExist p)) err
|
|
where
|
|
err :: Sem r ()
|
|
err = do
|
|
logError (mkAnsiText @Text [i|The input path #{p} does not exist|])
|
|
exitFailure
|